我一直试图解决我在面试时被问到的问题,但是没有成功,就是这样:
考虑Ruby中的以下结构:
['dog', 'donkey', 'cat', 'cow', 'horse']
你怎么把它变成这个:
{ 'd' => ['dog', 'donkey'], 'c' => ['cat', 'cow'], 'h' => ['horse'] }
尽可能地说是惯用语吗?
我已经尝试了很多方法,只是已经接近了,并且也看到了很多类似的问题,但从来没有特别解决这个问题,
你们会怎么做?你能帮我解决一下吗?
最诚挚的问候,
答案 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。它可以用来做你必须做的事情。阅读方法的来源,您将获得如何实现这一目标的良好范例。