Что нового

[Массивы] сравнить 2 двумерных массива

tinliin

Новичок
Сообщения
6
Репутация
0
есть массив $a[100][3] и массив $b[100][3]
в обоих элемент $a[0][0]=количеству значений
сами значения начинаются с [1][1] например $a[1][1]="alpha" $a[1][2]="beta"
получается что-то вроде таблицы если я правильно понимаю :scratch:
так вот, нужно сравнить их и получить значения которые присутствуют в одном из массивов и которых нет в другом и наоборот
вроде должно быть 2 цикла, я себе весь мозг сморщил пока пытался это сделать
Код:
Local $n, $m
   $new[0][0]=$n
   $old[0][0]=$m

	  For $i=1 To $n
		 For $j=1 To $m
			If $new[$i][1]<>$old[$j][1] Or $new[$i][2]<>$old[$j][2] Then
			   lg( "   +   " & $new[$i][1] & " - " & $new[$i][2] )
			EndIf
		 Next
	  Next

	  For $k=1 To $m
		 For $l=1 To $n
			If $old[$k][1]<>$new[$l][1] Or $old[$k][2]<>$new[$l][2] Then
			   lg( "   -   " & $old[$k][1] & " - " & $old[$k][2] )
			EndIf
		 Next
	  Next

результата с вышеприведенного кода никакого :stars:
если че функция lg работает :smile:
Код:
Func lg( $text )
   $text = "[ " & _Now() & " ] " & $text
   Local $h = FileOpen( "autoit.log", 1 )
   FileWriteLine( $h, $text )
   FileClose( $h )
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <Date.au3>

Global $new[6][3] = [[5,"",""],[0,"a","b"],[0,"c","d"],[0,"e","f"],[0,"g","h"],[0,"i","j"]]
Global $old[6][3] = [[5,"",""],[0,"a","b"],[0,"e","f"],[0,"k","b"],[0,"c","d"],[0,"i","y"]]

Global $n=$new[0][0]
Global $m=$old[0][0]

For $i=1 To $n
   For $j=1 To $m
       If $new[$i][1]=$old[$j][1] And $new[$i][2]=$old[$j][2] Then ExitLoop
   Next
   If $j>$m Then lg( "   +   " & $new[$i][1] & " - " & $new[$i][2] )
Next

For $k=1 To $m
   For $l=1 To $n
       If $old[$k][1]=$new[$l][1] And $old[$k][2]=$new[$l][2] Then ExitLoop
   Next
   If $l>$n Then lg( "   -   " & $old[$k][1] & " - " & $old[$k][2] )
Next

Func lg( $text )
   $text = "[ " & _Now() & " ] " & $text
   Local $h = FileOpen( "autoit.log", 1 )
   FileWriteLine( $h, $text )
   FileClose( $h )
EndFunc
 
Автор
T

tinliin

Новичок
Сообщения
6
Репутация
0
большое спасибо, работает как надо :laugh:
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Global $new[6][3] = [[5,"",""],[0,"a","b"],[0,"c","d"],[0,"e","f"],[0,"g","h"],[0,"i","j"]] Global $old[6][3] = [[5,"",""],[0,"a","b"],[0,"e","f"],[0,"k","b"],[0,"c","d"],[0,"i","y"]]
Что-то не получается у меня сравнить два двумерных массива
Код:
#include <Array.au3>
Global $aArray1[5][2] = [[0,0],[1,1],[2,3],[3,4],[4,5]]
Global $aArray2[7][2] = [[1,''],[3,''],[4,''],[6,''],[7,''],[11,''],[12,'']]
Global $new=$aArray1
Global $old=$aArray2

_ArrayDisplay($new, 'new')
_ArrayDisplay($old, 'old')

Local $aaa[0], $bbb[0]
For $i=1 To UBound($new)-1
   For $j=1 To UBound($old)-1
       If $new[$i][1]=$old[$j][1] And $new[$i][2]=$old[$j][2] Then ExitLoop
   Next
     If $j>UBound($old)-1 Then _ArrayAdd($bbb, $old[$j][0])
Next

For $k=1 To UBound($old)-1
   For $l=1 To UBound($new)-1
       If $old[$k][1]=$new[$l][1] And $old[$k][2]=$new[$l][2] Then ExitLoop
   Next
     If $l>UBound($new)-1 Then _ArrayAdd($aaa, $new[$l][0])
Next

_ArrayDisplay($aaa, 'aaa')
_ArrayDisplay($bbb, 'bbb')
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
не получается у меня сравнить
Вы неправильно работаете с индексами. В ваших массивах индексы колонок [0] и [1]. А вы обращаетесь к [2].
И в условиях после циклов по $j и $l элементы $old[$j][0] и $new[$l][0] выходят за пределы массивов, т.к. $j и $l равны размерам массивов.
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Вы неправильно работаете с индексами. В ваших массивах индексы колонок [0] и [1]. А вы обращаетесь к [2].
Только все равно выдает ту же ошибку, до проверки элементов $old[$j][0] и $new[$l][0] не доходит
Код:
For $i=1 To UBound($new)-1
   For $j=1 To UBound($old)-1
       If $new[$i][0]=$old[$j][0] And $new[$i][1]=$old[$j][1] Then ExitLoop
   Next
   If $j>UBound($old)-1 Then _ArrayAdd($bbb, $old[$j][0])
Next

For $k=1 To UBound($old)-1
   For $l=1 To UBound($new)-1
       If $old[$k][0]=$new[$l][0] And $old[$k][1]=$new[$l][1] Then ExitLoop
   Next
    If $l>UBound($new)-1 Then _ArrayAdd($aaa, $new[$l][0])
Next
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
все равно выдает ту же ошибку
Я же вам объяснил - почему
в условиях после циклов по $j и $l элементы $old[$j][0] и $new[$l][0] выходят за пределы массивов, т.к. $j и $l равны размерам массивов


Добавьте отладку и посмотрите вывод в консоль
Код:
For $i=1 To UBound($new)-1
   For $j=1 To UBound($old)-1
       ConsoleWrite($i & ":" & $j & @CRLF) ; отладка
       If $new[$i][0]=$old[$j][0] And $new[$i][1]=$old[$j][1] Then ExitLoop
   Next
   ConsoleWrite("$j = " & $j & @CRLF) ; отладка
   If $j>UBound($old)-1 Then _ArrayAdd($bbb, $old[$j][0])
Next
При завершении внутреннего цикла $j = 7, а последняя строка массива $old имеет индекс [6].
 
Верх