如何检查两个数组是否包含相同的元素?
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.
您的代码将起作用。原因是您不能从 Array
中 removeFirst
。这就是为什么您需要 OrderedCollection
的原因。 (注意 b.t.w。arr2copy
的大小写不匹配)。
当然,此实现不如已接受答案中的实现有效,但我认为也可以向您提供一些有关您的方法的反馈。
有什么简单的方法可以检查两个数组是否包含相同的元素?
这是我的尝试,我 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.
您的代码将起作用。原因是您不能从 Array
中 removeFirst
。这就是为什么您需要 OrderedCollection
的原因。 (注意 b.t.w。arr2copy
的大小写不匹配)。
当然,此实现不如已接受答案中的实现有效,但我认为也可以向您提供一些有关您的方法的反馈。