2011-08-07 14 views
1

Rubyで配列を辞書に変換するには?私はそれがまさにこのようなものだった、私はインタビューの中で頼まれた問題を解決するために失敗したしようとしてきた

はRubyで次のような構造を考えてみましょう:

あなたはこのにそれを回すだろうか
['dog', 'donkey', 'cat', 'cow', 'horse'] 

1つ:

{ 'd' => ['dog', 'donkey'], 'c' => ['cat', 'cow'], 'h' => ['horse'] } 

できるだけ慣用的なものはありますか?

は、私は多くの方法を試してみました、とだけ近い得ている、とも周りの多くの同様の問題を見てきましたが、決して特にこの1に対する解決策、

あなたたちはそれをどのように行うのでしょうか?私がそれを解決するのを助けることができますか?

よろしく、あなたの言葉の

答えて

3

あなた自身を構築する必要がある場合:

animals = ['dog', 'donkey', 'cat', 'cow', 'horse'] 
animals.inject(Hash.new{|h,k|h[k]=[]}) { |h, animal| h[animal[0]] << animal;h} 
#=> {"d"=>["dog", "donkey"], "c"=>["cat", "cow"], "h"=>["horse"]} 

主な利点は、あなたが一度だけ、アレイを通過しなければならないということです。 injectを消化するのが難しい場合は、1.9のeach_with_objectをご覧ください。他の人が指摘したように、彼らはおそらくgroup_byを望んでいた。

+0

は非推奨のものではありませんか?ただ疑問に思う。 – jlstr

+0

ドキュメントには何も表示されていません。もしRubyが1.9の中核Rubyの一部になったので、Railsで廃止予定になったのでしょうか? –

+0

とにかく、あなたの解決策はインタビューの男が望む方法です。それはgroupbyの代わりにinjectを使用しているからです。優れたレッスン、ありがとうマイケル!誠実に – jlstr

10

Group by最初の文字:

['dog', 'donkey', 'cat', 'cow', 'horse'].group_by{|i|i[0]} 

または少し凝っている:

['dog', 'donkey', 'cat', 'cow', 'horse'].group_by &:chr 
+0

ああ私の神はこれは素晴らしいです! インタビュー中の男は言った: "注射やeach_with_objectのようなメソッドを見て" – jlstr

+0

'&:chr'はどのように機能しますか? –

+0

@Karl Knechtel参照[ここをクリック](http://stackoverflow.com/questions/1961030) – Howard

関連する問題