如何检查两个数组是否包含相同的元素?

How to check if two arrays contain the same elements?

有什么简单的方法可以检查两个数组是否包含相同的元素

这是我的尝试,我 return 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

如果元素应该相等并且在相同的顺序,你可以只比较数组与= .

如果元素应该相等并且顺序无关紧要并且没有重复项 符合预期,请使用 array1 asSet = arr2 asSet.

否则你可以查看 hasEqualElements:,以及 asBag

如果元素应该相同并且顺序相同,这个怎么样?

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

它同时遍历两个数组,比较相同索引处元素的标识。如果有任何不相同,return false。如果没有遇到不同的元素,return true。

作为旁注,请注意您的代码几乎是正确的。只需更改:

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

具有以下内容:

arr2copy := arr2 asOrderedCollection.  

您的代码将起作用。原因是您不能从 ArrayremoveFirst。这就是为什么您需要 OrderedCollection 的原因。 (注意 b.t.w。arr2copy 的大小写不匹配)。

当然,此实现不如已接受答案中的实现有效,但我认为也可以向您提供一些有关您的方法的反馈。