Что нового

[Массивы] Сравнить массивы!

modnik

Знающий
Сообщения
138
Репутация
13
вот допустим есть код, сравнивающий массивы
Код:
#include <Array.au3>

Dim $a1[5]=[4,0xDDDDDD,0xDD8080,0x8080AA,0x80DD80]
Dim $a2[5]=[4,0xEEEEEE,0xEE8080,0x8080BB,0x80EE80]
Dim $a3[5]=[4,0xFFFFFF,0xFF8080,0x8080CC,0x80FF80]
Dim $a4[5]=[4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]

 Dim $a55[5]=[4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]
;Dim $a55[5]=[4,0xDCCCCC,0xCC8080,0x8080DD,0x80CC80]

$sStr1=_ArrayToString( $a1,  1 )
$sStr2=_ArrayToString( $a2,  1 )
$sStr3=_ArrayToString( $a3,  1 )
$sStr4=_ArrayToString( $a4,  1 )

$sStr1_4=$sStr1 & $sStr2 & $sStr3 & $sStr4

$sStr55=_ArrayToString( $a55,  1 ) 

If StringRegExp ( $sStr1_4, $sStr55 , 0 ) Then 
    MsgBox(0,'','Совпадение найдено')
Else   
    MsgBox(0,'','Совпадений нет')
EndIf

можно как то получить номер массива с которым произошло совпадение?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А не лучше было бы сравнить посимвольно каждый массив с эталонным?
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
А подскажите пожалуйста как это сделать?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
modnik
Я предлагаю такой вариант...

Код:
; НАЧАЛО

 Dim $AA[4][5]=[[4,0xDDDDDD,0xDD8080,0x8080AA,0x80DD80], _
                [4,0xEEEEEE,0xEE8080,0x8080BB,0x80EE80], _
                [4,0xFFFFFF,0xFF8080,0x8080CC,0x80FF80], _
                [4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]]

 Dim $AB[5]=[4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]
 ; Dim $ab[5]=[4,0xDCCCCC,0xCC8080,0x8080DD,0x80CC80]

 for $J=0 to 3
  $R=true
  for $I=0 to 4
   if $AA[$J][$I]<>$AB[$I] then $R=false
  next
  if $R then MsgBox(0,"","Совпадает с "&$J&"-ым массивом")
 next

 MsgBox(0,"","Конец")

; КОНЕЦ
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
snoitaleR сказал(а):
modnik
Я предлагаю такой вариант...

Код:
; НАЧАЛО

 Dim $AA[4][5]=[[4,0xDDDDDD,0xDD8080,0x8080AA,0x80DD80], _
                [4,0xEEEEEE,0xEE8080,0x8080BB,0x80EE80], _
                [4,0xFFFFFF,0xFF8080,0x8080CC,0x80FF80], _
                [4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]]

 Dim $AB[5]=[4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]
 ; Dim $ab[5]=[4,0xDCCCCC,0xCC8080,0x8080DD,0x80CC80]

 for $J=0 to 3
  $R=true
  for $I=0 to 4
   if $AA[$J][$I]<>$AB[$I] then $R=false
  next
  if $R then MsgBox(0,"","Совпадает с "&$J&"-ым массивом")
 next

 MsgBox(0,"","Конец")

; КОНЕЦ

не очень понимаю как, но всё работает.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
snoitaleR сказал(а):
modnik
Я предлагаю такой вариант...

Код:
; НАЧАЛО

 Dim $AA[4][5]=[[4,0xDDDDDD,0xDD8080,0x8080AA,0x80DD80], _
                [4,0xEEEEEE,0xEE8080,0x8080BB,0x80EE80], _
                [4,0xFFFFFF,0xFF8080,0x8080CC,0x80FF80], _
                [4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]]

 Dim $AB[5]=[4,0xCCCCCC,0xCC8080,0x8080DD,0x80CC80]
 ; Dim $ab[5]=[4,0xDCCCCC,0xCC8080,0x8080DD,0x80CC80]

 for $J=0 to 3
  $R=true
  for $I=0 to 4
   if $AA[$J][$I]<>$AB[$I] then $R=false
  next
  if $R then MsgBox(0,"","Совпадает с "&$J&"-ым массивом")
 next

 MsgBox(0,"","Конец")

; КОНЕЦ
Можно чуть-чуть подправить:
Код:
for $I=0 to 4
   if $AA[$J][$I]<>$AB[$I] then 
       $R=false
       ExitLoop
   EndIf
  next

При больших объемах будет экономия времени. И почему то мне кажется, что есть варианты сравнения и попроще.
 
Верх