2013-06-01 128 views
1

我知道for循環應該避免,我想更好的辦法,通過數組進行迭代的,而不是做比較來自多個哈希值

for i in 0..array.size-1 do 
    puts array[i] 
end 

array.each{ |x| 
    puts x 
} 

但如果我有一堆散列像

array = [{:value0 => 1, :value1 => 0}, {:value0 => 2, :value1 => 1}, {:value0 => 1, :value1 => 2}] 

並希望檢查是否:value0在所有散列中唯一。直覺上我會做類似

for i in 0..array.size-1 do 
    _value_buffer = array[i][:value0] 
    for j in i+1..array.size-1 do 
    if _value_buffer == array[j][:value0] 
     puts "whatever" 
    end 
    end 
end 

有沒有更好的方法來做到這一點?

+1

哦,而且,順便說一句,你*永遠不需要在Ruby中使用'for'。如果你真的需要索引,你可以使用['each_with_index'](http://ruby-doc.org/core-2.0/Enumerable.html#method-i-each_with_index)或['with_index'](http:// ruby-doc.org/core-2.0/Enumerator.html#method-i-with_index),或者可能是'(0 ..(array.size - 1))。times {| i | ''。 –

+0

我會記住這一點,謝謝! – Zois

回答

4

爲什麼不只是得到所有有問題的值,看看它們是否是唯一的?

!array.map { |h| h[:value0] }.uniq! 

uniq!回報nil時有沒有重複)

+0

你想要大小等於1嗎?或者數組的長度?這是一個很好的解決方案。 – squiguy

+0

@squiguy你是對的,但我會完全繞過這一點,以保持解決方案是一個變量,並且不需要單線程':)'。 –

+0

這很聰明,我從來沒有真正想過使用破壞性的方法。 +1 – squiguy

2

這裏是我會怎麼做:

2.0.0p195 :001 > array = [{:value0 => 1, :value2 => 0}, {:value0 => 2, :value2 => 1}, {:value0 => 1, :value2 => 2}] 
=> [{:value0=>1, :value2=>0}, {:value0=>2, :value2=>1}, {:value0=>1, :value2=>2}] 
2.0.0p195 :002 > val0 = array.map { |hash| hash[:value0] } 
=> [1, 2, 1] 
2.0.0p195 :003 > puts val0.uniq == val0 
false 
=> nil 

我將收集的:value0值,然後比較他們唯一值的數組。

3

至於什麼安德魯·馬歇爾說,你可以使用uniq的!但用更簡潔的方式:

!array.uniq!{|a| a[:value0]}