2011-08-07 43 views
1

我一直沒有成功解決的採訪時,我被問了一個問題,這是完全一樣:如何將數組轉換爲Ruby中的字典?

考慮在Ruby中的結構如下:

['dog', 'donkey', 'cat', 'cow', 'horse'] 

你將如何把它變成這樣one:

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

儘可能地道?

我已經嘗試了很多辦法,只有已經變得接近,而且還圍繞見過很多類似的問題,但從來沒有一個解決方案,這其中尤其

你們會怎麼做呢?你能幫我解決嗎?

最好的問候,

回答

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

文檔中沒有提示。也許它在Rails中被棄用,因爲它成爲1.9核心Ruby的一部分? –

+0

總而言之,你的解決方案就是面試中的人想要的方式。因爲它使用注入,而不是groupby。優秀的教訓,謝謝邁克爾!真誠。 – 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

'&:如何工作? –

+0

@Karl Knechtel參見例如[這裏](http://stackoverflow.com/questions/1961030) – Howard