2011-12-03 106 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