如何在Ruby中将数组转换为Dictionary?

时间:2011-08-07 14:35:26

标签: ruby arrays algorithm hash dictionary

我一直试图解决我在面试时被问到的问题,但是没有成功,就是这样:

考虑Ruby中的以下结构:

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

你怎么把它变成这个:

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

尽可能地说是惯用语吗?

我已经尝试了很多方法,只是已经接近了,并且也看到了很多类似的问题,但从来没有特别解决这个问题,

你们会怎么做?你能帮我解决一下吗?

最诚挚的问候,

3 个答案:

答案 0 :(得分:10)

Group by你单词的第一个字符:

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

或者有点发烧友:

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

答案 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

答案 2 :(得分:0)

看看http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by。它是Rails中的core_ext。它可以用来做你必须做的事情。阅读方法的来源,您将获得如何实现这一目标的良好范例。