2013-04-20 137 views
3

我想知道兩個Ruby數組是否具有相同的元素,但不一定是相同的順序。有沒有一種原生的方式來做到這一點? Array的相等運算符似乎檢查項目是否相同,順序是否相同,我需要放鬆後一個條件。在Ruby中比較兩個數組

這將是非常容易寫,我只是想知道是否有一個原生的成語。

+0

如果數組中的數據是可比的,你可以比較之前對它們進行排序。 – 9000 2013-04-20 12:19:37

+3

有可能數組有兩次或更多的相同元素?如果是這樣,你想用它做什麼? – sawa 2013-04-20 13:09:03

+0

[在Ruby中比較兩個數組]可能的重複(http://stackoverflow.com/questions/9095017/comparing-two-arrays-in-ruby) – 2016-06-29 19:35:26

回答

4
[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 
3

這將是非常容易寫,我只是不知道是否有一個本地的成語。

恐怕沒有它的原生習語。

如果你的數組包含多個值,你想在這兩個數組上進行計數,你必須使用#sort來使它們的順序相同。一旦你這樣做,你可以很容易地對它們進行比較:

a.sort == b.sort 

否則,你可以使用#uniq將提取數組的唯一值(使它更快),並使用#sort像上面:

a.uniq.sort == b.uniq.sort 
7

如果你沒有重複的項目要麼,你可以使用Set代替Array

Set實現無重複值的集合。 這是Array的直觀互操作設施和 哈希快速查找的混合。

例子:

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 
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 
+0

'a3 = [1,2,3,4,5 ]'? – Stefan 2013-04-20 21:22:20