5

我想知道两个 Ruby 数组是否具有相同的元素,尽管不一定顺序相同。有没有本地方法可以做到这一点?Array 的相等运算符似乎检查项目是否相同,顺序是否相同,我需要放宽后一个条件。

这将非常容易编写,我只是想知道是否有本地成语。

4

4 回答 4

9

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

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
于 2013-04-20T13:51:56.397 回答
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
于 2013-04-20T12:30:52.703 回答
4

这将非常容易编写,我只是想知道是否有本地成语。

恐怕没有本地成语。

如果您的数组包含多个您想在两个数组上都计数的值,则必须使用#sort将它们按相同的顺序排列。完成后,您可以轻松地比较它们:

a.sort == b.sort

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

a.uniq.sort == b.uniq.sort
于 2013-04-20T12:39:33.580 回答
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
于 2013-04-20T19:19:30.847 回答