2011-12-03 77 views

回答

574
​​

uniq method删除所有重复元素并保留数组中的所有唯一元素。

Ruby语言的许多美女之一。

+73

或在这种情况下,只是''array.uniq代替其工作! – cvshepherd

+38

不,uniq!如果数组已经是唯一的,方法将返回nil 例如:a = [1,2,3,4] a.uniq - > [1,2,3,4] 但是 a.uniq! - >无 – duykhoa

+12

我真的不认为这是一个红宝石语言的美丽......它只是红宝石标准库的美丽? 不要误解我的意思,关于这门语言有很多美丽的东西。 –

41

您可以删除与uniq的方法重复的元素:

array.uniq # => [1, 2, 4, 5, 6, 7, 8] 

什么可能还需要了解的是,uniq的方法需要一个块,因此例如,如果你有这样的按键阵列:

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"] 

,你想知道什么是独特的文件,你可以用它找出来:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last } 
+5

我对此有点困惑。如果您需要自己的比较函数,则使用该块 - 在您的示例中,如果将uniq发送到没有块的阵列,将会返回与块一样的值。 – hdgarrood

+0

@hdgarrood是的你是对的,我没有注意到;请参阅我的更新回答 – maprihoda

12

如果有人正在寻找一种方法来删除重复值的所有实例,请参阅this question

a = [1, 2, 2, 3] 
counts = Hash.new(0) 
a.each { |v| counts[v] += 1 } 
p counts.select { |v, count| count == 1 }.keys # [1, 3] 
+0

或者可以简单地做 'a = [1,2,3] a.find_all {| x | a.count(x)== 1}#[1,3]' –

71

您也可以返回交集。

a = [1,1,2,3] 
a & a 

这也将删除重复项。

+9

从功能上来说,这个答案是正确的,但我认为这比仅使用uniq的可读性明显降低。 –

+16

我只是把它放在这里,所以无论谁访问这个页面,都会看到其他的方法,我并不是想说它以任何方式更好。 – jaredsmith

+3

这个原因起作用是因为当使用set操作时,结果数组被视为一个集合,这是一个通常没有重复值的数据结构。使用'a |一个'(联合)会做同样的伎俩。 – Cezar

8

如果有人在意,只是另一种选择。

您也可以使用将数组转换为集合的数组的方法to_set,并且根据定义,集合元素是唯一的。

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6] 
0

这是一个非常普遍的一类问题,有许多变化。但前提保持不变。输入数组由整数组成,其中一些可能是重复的。我们应该打印该阵列中存在的所有唯一编号。

Check the complete implementation here

0

与XOR操作员尝试在Ruby中:

a = [3,2,3,2,3,5,6,7].sort! 

result = a.reject.with_index do |ele,index| 
    res = (a[index+1]^ele) 
    res == 0 
end 

print result