2014-02-18 79 views
0
有條件刪除重複

所以我有這個數組:從陣列中的紅寶石

['One', 'Two', 'One', 'One', 'Three', 'Three', 'One'] 

我想要得到這樣的結果:

['One', 'Two', 'One', 'Three', 'One'] 

所以我想刪除的項目是一樣的上一個項目。 如何在Ruby中做到這一點?

回答

5

使用Enumerable#chunk

ary = ['One', 'Two', 'One', 'One', 'Three', 'Three', 'One'] 
ary.chunk {|x| x }.map(&:first) 

#=> ["One", "Two", "One", "Three", "One"] 

可枚舉#塊列舉過的項目,基於塊的返回值分塊在一起。將返回相同塊值的連續元素分塊在一起。

ary.chunk {|x| x }.to_a 
=> [["One", ["One"]], 
["Two", ["Two"]], 
["One", ["One", "One"]], 
["Three", ["Three", "Three"]], 
["One", ["One"]]] 

map(&:first)Array#map迭代陣列調用陣列

&:first的每個元件上的first法在被稱爲symbol to proc它創建一個進程內對象,該陣列的每個元素映射屈服於

所以上面的例子可以改寫爲:

lambda_obj = ->(ele) { ele.first } 
ary.chunk {|x| x }.map(&lambda_obj) 

#=> ["One", "Two", "One", "Three", "One"] 
+0

你的答案是第一,它是做什麼的,我需要的,我想這是真的很大。但是很難閱讀並理解塊之後的映射邏輯,能否請你解釋一下地圖部分? –

+0

哦......這不太可讀......你怎麼看待roippi的不夠? –

+0

@BrazhnykYuriy你有沒有通過我的解釋 – bjhaid

2

inject很簡單:

ary.inject [] do |accum,x| 
    accum.last == x ? accum : accum << x 
end 
+2

很好,沒有花哨的技巧,我實際上可以從這段代碼中讀取邏輯。謝謝!我喜歡你的無私。但總的來說,我認爲塊是這項工作的正確功能...... –

+1

在這種情況下,我們也可以使用'#each_with_object':'ary.each_with_object [] do | e,a | a << e除非a.last == e end'。 –

+0

+1 @BorisStitnicky給你..我總是喜歡'each_with_object'。 –