Что нового

[Массивы] Как проверить на идентичность два массива?

Kalisnik

Эволюция
Сообщения
295
Репутация
63
У меня не получается...
ни так:
Код:
$Array1 = $Array2


ни так:
Код:
$Array1 == $Array2
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Если массивы не слишком длинные, попробуй так:

Код:
#Include <Array.au3>

if _ArrayToString($Array1) = _ArrayToString($Array2) Then ...
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Suppir сказал(а):
Если массивы не слишком длинные, попробуй так:

Код:
#Include <Array.au3>

if _ArrayToString($Array1) = _ArrayToString($Array2) Then ...
Это дополнительная библиотека? Надеюсь она присутствует по-умолчанию в Autoit? И спасибо за ответ :smile:
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Она входит в стандартную поставку AutoIt.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Лучше так:

Код:
#Include <Array.au3>

if _ArrayToString($Array1) == _ArrayToString($Array2) Then ...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
а как же массивы типа
Код:
$array1[2] = [1, 2]
$array2[2] = ['1', '2']

или таких несоответствий не предвидится по контексту задачи?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Yashied [?]
Или так:

Код:
#Include <Array.au3>

Dim $Array1[2] = [1, 2]
Dim $Array2[2] = [1, 3]

If StringCompare(_ArrayToString($Array1), _ArrayToString($Array2), 1) = 0 Then
	ConsoleWrite('$Array1 and $Array2 are identical arrays' & @LF)
Else
	ConsoleWrite('$Array1 and $Array2 are NOT identical arrays' & @LF)
EndIf



Kaster [?]
а как же массивы типа
Если это должно учитываться, тогда я бы сделал так (моя изменённая функция для сравнения массивов, как одномерных, так двумерных):

Код:
Dim $Array1[2] = [1, 2]
Dim $Array2[2] = ['1', '2']

$iCompare = _ArrayCompare($Array1, $Array2, 0, -1, 1, 1)

If @error Then
	ConsoleWrite('$Array1 and $Array2 are NOT identical arrays' & @LF & 'ERROR: ' & @error & @LF)
ElseIf $iCompare = 0 Then
	ConsoleWrite('$Array1 and $Array2 are identical arrays' & @LF)
ElseIf $iCompare = 1 Then
	ConsoleWrite('$Array1 and $Array2 are NOT identical arrays' & @LF)
EndIf

Func _ArrayCompare(Const ByRef $avArray1, Const ByRef $avArray2, $iArrStart=0, $iArrEnd=-1, $iCaseSense=1, $iVarTypeSense=0)
	If Not IsArray($avArray1) Or Not IsArray($avArray2) Then
		Return SetError(1, 0, 0)
	EndIf
	
	Local $iDims1 = UBound($avArray1, 0), $iUBound1 = UBound($avArray1, 1) - 1, $iSubMax1 = UBound($avArray1, 2) - 1
	Local $iDims2 = UBound($avArray2, 0), $iUBound2 = UBound($avArray2, 1) - 1, $iSubMax2 = UBound($avArray2, 2) - 1
	
	If $iArrStart < -1 Or $iArrStart > $iUBound1 Or $iArrEnd < -1 Or $iArrEnd > $iUBound1 Or ($iArrStart > $iArrEnd And $iArrEnd > -1) Then
		Return SetError(-1, 0, 0)
	EndIf
	
	If $iDims1 <> $iDims2 Or $iUbound1 <> $iUbound2 Or $iSubMax1 <> $iSubMax2 Then
		Return SetError(2, 0, 0)
	EndIf
	
	If $iDims1 > 2 Or $iDims2 > 2 Then
		Return SetError(3, 0, 0)
	EndIf
	
	If $iArrStart = -1 Or (IsKeyword($iArrStart) And $iArrStart = Default) Then
		$iArrStart = 0
	EndIf
	
	If $iArrEnd = -1 Or (IsKeyword($iArrEnd) And $iArrEnd = Default) Then
		$iArrEnd = $iUbound1
	EndIf
	
	If $iDims1 = 2 Then
		For $i = $iArrStart To $iArrEnd
			For $j = 0 To $iSubMax1
				If StringCompare($avArray1[$i][$j], $avArray2[$i][$j], $iCaseSense) <> 0 Then ;The strings are NOT equal
					Return 1
				EndIf
				
				If $iVarTypeSense And VarGetType($avArray1[$i][$j]) <> VarGetType($avArray2[$i][$j]) Then
					Return 1
				EndIf
			Next
		Next
	Else
		For $i = $iArrStart To $iArrEnd
			If StringCompare($avArray1[$i], $avArray2[$i], $iCaseSense) <> 0 Then ;The strings are NOT equal
				Return 1
			EndIf
			
			If $iVarTypeSense And VarGetType($avArray1[$i]) <> VarGetType($avArray2[$i]) Then
				Return 1
			EndIf
		Next
	EndIf
	
	Return 0
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
а я бы просто сравнил md5 хеши этих двух массивов
http://autoit-script.ru/index.php?topic=1247.0
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
CreatoR
чет та функция выдает не совсем верный результат, или я накосячил
Возьми в качестве теста массивы
Код:
Dim $Array1[2] = [1, 2]
Dim $Array2[2] = [1, 3]
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Kaster сказал(а):
а как же массивы типа
Код:
$array1[2] = [1, 2]
$array2[2] = ['1', '2']

или таких несоответствий не предвидится по контексту задачи?
В моем случае все массивы содержат данные только в числовом виде. Однако как решить ситуацию приведенную Вами выше? - на будущее... если вдруг у кого-нибудь возникнет надобность. :smile: Хотя, с другой стороны... думаю избежать подобную ситуацию в ходе прописывания кода можно массой способов. :smile:

Ого! Пока писал это сообщение, сколько новых сообщений появилось! :shok:
 
Верх