2017-10-10 10 views
0

私は整数を配列にマップするハッシュを持っています。たとえば、一致する要素が見つかるまで、どのようにハッシュを反復処理しますか?

{1 => ["abc"], 2 => ["ccc", "ddd"]} 

値が1の配列サイズを持つエントリを見つけるまで、ハッシュを反復処理する方法はありますか。通常はできます

arr.detect{|element| element.size == 1} 

しかし、それは配列に対してのみ機能します。似たようなロジックをハッシュに適用する方法がわかりません。

+1

[前の質問への回答](https://stackoverflow.com/a/46656045/477037)を見てください。これらのメソッドでは二つの引数**、キーとその値、すなわち 'detect {| k、v | ...} ' – Stefan

答えて

2

同じ原則が適用されます。

key, value = h.find do |_, l| 
    l.size == 1 
end 
# => [ 1, ["abc"]] 
key 
# => 1 
value 
# => ["abc"] 

あなただけの値を気にした場合、それはさらに簡単です:今

h = {1 => ["abc"], 2 => ["ccc", "ddd"]} 

h.find do |_, l| 
    l.size == 1 
end 
# => [ 1, ["abc"]] 

あなたがその探しているなら、より有益な変数セットのように:

list = h.values.find do |l| 
    l.size == 1 
end 
+1

' do ... end'構文は、割り当てと非常に短いブロックの内容を考えると少し珍しいです。 – Stefan

+0

@Stefan '{...}'の長い形式のバージョンです。これは、自身の行に公開されているので、内部で起こっていることをより明確にする傾向があります。それはまた、コメントの追加を容易にします。 – tadman

関連する問題