Автор Тема: [Массивы] Как проверить на идентичность два массива?  (Прочитано 7232 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kalisnik [?]

  • Продвинутый
  • ***
  • Сообщений: 293
  • Репутация: 63
  • Пол: Мужской
  • Эволюция
    • Награды
У меня не получается...
ни так:
Код: AutoIt [Выделить]
$Array1 = $Array2
 


ни так:
Код: AutoIt [Выделить]
$Array1 == $Array2
 


Русское сообщество AutoIt


Оффлайн Suppir [?]

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

Код: AutoIt [Выделить]
#Include <Array.au3>

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


Оффлайн Kalisnik [?]

  • Продвинутый
  • ***
  • Сообщений: 293

  • Автор темы
  • Репутация: 63
  • Пол: Мужской
  • Эволюция
    • Награды
Если массивы не слишком длинные, попробуй так:

Код: AutoIt [Выделить]
#Include <Array.au3>

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


Это дополнительная библиотека? Надеюсь она присутствует по-умолчанию в Autoit? И спасибо за ответ  :)

Оффлайн Suppir [?]

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

Русское сообщество AutoIt

Re: [Массивы] Как проверить на идентичность два массива?
« Ответ #3 Отправлен: Апрель 08, 2010, 11:21:53 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Лучше так:

Код: AutoIt [Выделить]
#Include <Array.au3>

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



Думай, прежде чем говорить.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
а как же массивы типа
Код: AutoIt [Выделить]
$array1[2] = [1, 2]
$array2[2] = ['1', '2']

или таких несоответствий не предвидится по контексту задачи?
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Yashied  [?]
Цитировать
Лучше так:
Или так:

Код: AutoIt [Выделить]
#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  [?]
Цитировать
а как же массивы типа
Если это должно учитываться, тогда я бы сделал так (моя изменённая функция для сравнения массивов, как одномерных, так двумерных):

Код: AutoIt [Выделить]
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

« Последнее редактирование: Апрель 08, 2010, 18:05:58 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
а я бы просто сравнил md5 хеши этих двух массивов
http://autoit-script.ru/index.php?topic=1247.0

Русское сообщество AutoIt

Re: [Массивы] Как проверить на идентичность два массива?
« Ответ #7 Отправлен: Апрель 08, 2010, 15:14:04 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Kaster  [?]
Цитировать
я бы просто сравнил md5 хеши этих двух массивов
Если я не ошибаюсь, это будет помедленнее.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR
чет та функция выдает не совсем верный результат, или я накосячил
Возьми в качестве теста массивы
Код: AutoIt [Выделить]
Dim $Array1[2] = [1, 2]
Dim $Array2[2] = [1, 3]


Оффлайн Kalisnik [?]

  • Продвинутый
  • ***
  • Сообщений: 293

  • Автор темы
  • Репутация: 63
  • Пол: Мужской
  • Эволюция
    • Награды
а как же массивы типа
Код: AutoIt [Выделить]
$array1[2] = [1, 2]
$array2[2] = ['1', '2']

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

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

Ого! Пока писал это сообщение, сколько новых сообщений появилось!  :o
« Последнее редактирование: Апрель 08, 2010, 16:09:07 от Kalisnik »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Kaster  [?]
Цитировать
функция выдает не совсем верный результат
Сорри, поправил.

Русское сообщество AutoIt

Re: [Массивы] Как проверить на идентичность два массива?
« Ответ #11 Отправлен: Апрель 08, 2010, 18:06:19 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
5567 Просмотров
Последний ответ Сентябрь 25, 2010, 19:31:24
от Kalisnik
1 Ответов
10857 Просмотров
Последний ответ Июнь 07, 2011, 01:59:02
от madmasles
12 Ответов
5590 Просмотров
Последний ответ Сентябрь 17, 2011, 14:20:56
от madmasles
2 Ответов
2791 Просмотров
Последний ответ Сентябрь 22, 2011, 13:31:50
от Seoqsss
21 Ответов
6894 Просмотров
Последний ответ Октябрь 10, 2011, 21:55:56
от gregaz
4 Ответов
3575 Просмотров
Последний ответ Октябрь 11, 2011, 23:54:01
от Notum
5 Ответов
3959 Просмотров
Последний ответ Ноябрь 26, 2013, 11:10:12
от InnI
6 Ответов
2195 Просмотров
Последний ответ Июнь 15, 2015, 12:34:47
от InnI
1 Ответов
1573 Просмотров
Последний ответ Ноябрь 05, 2015, 14:09:54
от InnI
1 Ответов
1080 Просмотров
Последний ответ Январь 09, 2017, 18:47:43
от InnI