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

时间:2019-06-08 10:02:02

标签: smalltalk pharo squeak

有没有一种简单的方法来检查两个数组是否包含相同的元素

这是我的尝试,如果数组不相同,我返回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 个答案:

答案 0 :(得分:7)

如果元素应该相等并且以相同的顺序,您可以将数组与 = 进行比较。

如果元素应相等顺序无关紧要并且没有没有重复项,请使用{{1} }。

否则,您可以签出 hasEqualElements: asBag

如果元素应该相同相同顺序,怎么办?

array1 asSet = arr2 asSet

它同时迭代两个数组,比较相同索引处元素的标识。如果不相同,则返回false。如果没有遇到不同的元素,则返回true。

答案 1 :(得分:3)

作为附带说明,请注意,您的代码几乎正确。只需更改:

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

具有以下内容:

arr2copy := arr2 asOrderedCollection.  

,您的代码即可使用。原因是您无法从removeFirstArray。这就是为什么您需要OrderedCollection的原因。 (请注意,arr2copy的大小写不匹配。)

当然,这种实现方式没有公认的答案有效,但是我认为也可以向您提供一些有关您的方法的反馈。