在Ruby中比较两个数组

5
我想知道如何判断两个Ruby数组是否具有相同的元素,但不一定是相同的顺序。是否有原生方式可以实现?数组的等式运算符似乎只检查项目是否相同且顺序是否相同,而我需要放宽后者的条件。
这很容易编写,我只是想知道是否有本地惯用语。

如果您的数组内容是可比较的,您可以在比较之前对它们进行排序。 - 9000
3
一个数组是否可能包含两个或更多相同的元素?如果是,你想对此做什么? - sawa
可能是比较两个Ruby数组的重复问题。 - Anderson Green
4个回答

9
如果您也没有重复的项目,可以使用Set而不是ArraySet

Set实现了一个无序、无重复值的集合。它是Array直观的互操作性和Hash快速查找的混合体。

示例:
require 'set'
s1 = Set.new [1, 2, 3]   # -> #<Set: {1, 2, 3}>
s2 = [3, 2, 1].to_set    # -> #<Set: {3, 2, 1}>
s1 == s2                 # -> true

6
[2,1].uniq.sort == [1,2].uniq.sort #=> true
[2,1,4].uniq.sort == [1,2].uniq.sort #=> false

或者
a1 = [1,2,3]
a2 = [2,3,1]
p (a2-a1).empty? && (a1-a2).empty? #=> true

a1 = [1,2,3]
a2 = [4,3,1]
p (a2-a1).empty? && (a1-a2).empty? #=> false

a1 = [1,2,3]
a2 = [2,3,1,5]
p (a2-a1).empty? && (a1-a2).empty? #=> false

4

这很容易写,只是我想知道是否有本地习语。

恐怕没有本地习语可用。

如果您的数组包含多个值,您希望在两个数组上进行计数,则必须使用#sort将它们放在相同的顺序中。完成后,您可以轻松比较它们:

a.sort == b.sort

否则,您可以使用#uniq来提取数组的唯一值(使其更快),并像上面那样使用#sort
a.uniq.sort == b.uniq.sort

0
a1 = [1, 2, 3, 4]
a2 = [4, 2, 1, 3]
(a1 & a2).size == a1.size # => true

a3 = [1, 2, 3, 5]
(a1 & a3).size == a1.size # => false

a3 = [1, 2, 3, 4, 5]怎么样? - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接