2015-11-03 42 views
0

如何找到哈希值中第一個不等於給定值的密鑰?鑑於以下哈希和價值100找到一個哈希值不是給定值的密鑰

h = { "a" => 100, "b" => 100, "c" => 800, "d" => 500 } 

我想找到"c" => 800

+1

你的問題不明確。 '「c」=> 800'不是Ruby對象。我們可以猜測你想要的關鍵是「c」或者「800」,或者是散列「{」c「=> 800}」,但是哪個? – sawa

回答

5

你可以這樣做:

no_match_value = 100 

h.find { |k,v| v != no_match_value }.first #=> "c" 

這是不尋常的是尋找位於散列中特定位置的鍵或值,但是(自Ruby v1.9起),您可以做到這一點。排序由密鑰插入順序決定。在v1.9之前,沒有排序哈希鍵的概念,就像集合中的元素沒有排序一樣。一些Rubiests認爲關鍵命令是異端邪說;其他人,包括我自己在內,都找到了很好的用途。

+0

@Anthony,我認爲你的意思是作爲替代'.first'。 (當然,它不是更有效率,因爲只要塊評估爲「真」,find就會停止)。你也可以編寫'h.each_key.find {| k | h [k]!= no_match_value}'。 –

1

您可以使用select

Hash[*h.select {|_, v| v != 100}.first] 
#=> {"c"=>800} 

如果沒有匹配它返回一個空哈希{}

沒有Hash[]部分,它會返回一個帶有鍵和值的數組。

+0

加上'.first'拿第一個 –

+1

'detect' /'find'會更合適:) –

+0

@SergioTulentsev,爲什麼更好? –

1

你可以這樣做:

h = { "a" => 100, "b" => 100, "c" => 800, "d" => 500 } 
h.reject!{|k,v| v == 100} 

# h = {"c"=>800, "d"=>500} 

所生成的散列將所有鍵/值對其中的值不是100

0

假設你想找到鑰匙,下面的代碼將工作:

h = { "a" => 100, "b" => 100, "c" => 800, "d" => 500 } 
result = h.detect{ |k,v| v != 100 }.first 
相關問題