Как проверить, содержат ли два массива одинаковые элементы? - PullRequest
2 голосов
/ 08 июня 2019

Есть ли простой способ проверить, содержат ли два массива одинаковые элементы ?

Вот моя попытка вернуть true, если массивы не одинаковы:

arr1 := #(1 3 5 6).
arr2 := #(1 2 3 4).
arr2Copy := arr2 copyFrom: 1 to: arr2 size.
arr1 size ~= arr2 size
    ifTrue: [^ true].
arr1
    do: [:a | (arr2copy removeFirst = a)
        ifFalse: [^ true]].
^false

Ответы [ 2 ]

7 голосов
/ 08 июня 2019

Если элементы должны быть равными и в том же порядке , вы можете просто сравнить массивы с = .

Если элементы должны быть равны , а порядок не имеет значения , а дубликатов не ожидается, используйте array1 asSet = arr2 asSet.

В противном случае вы можете проверить hasEqualElements: и asBag .

Если элементы должны быть идентичными и в том же порядке , как насчет этого?

array1 with: array2 do:
    [ :a :b | a == b ifFalse: [ ^ false ]].
 ^ true

Он выполняет итерацию по двум массивам одновременно, сравнивая тождества элементов с одинаковыми индексами. Если они не идентичны, верните false. Если отличных элементов не обнаружено, верните true.

3 голосов
/ 08 июня 2019

В качестве дополнительного комментария, обратите внимание, что ваш код был почти верным. Просто измените:

arr2Copy := arr2 copyFrom: 1 to: arr2 size.  

со следующим:

arr2copy := arr2 asOrderedCollection.  

и ваш код будет работать. Причина в том, что вы не можете removeFirst из Array. Вот почему вам нужен OrderedCollection вместо. (Обратите внимание, что между заглавными буквами arr2copy было несоответствие).

Конечно, эта реализация не так эффективна, как в принятом ответе, но я подумал, что было бы полезно также дать вам некоторые отзывы о вашем подходе.

...