在Ruby阵列中收集副本的最快/一行程序方法?

在Ruby阵列中收集副本的最快/一行程序方法?,ruby,arrays,Ruby,Arrays,转换如下数组的最快/一行方式是什么: [1,1,1,2,2,3,5,5,5,8,13,21,21,21] …放入一组对象中,如下所示: [{1=>4}、{2=>2}、{3=>1}、{5=>3}、{8=>1}、{13=>1}、{21=>3}]v}}并将其排序(如问题示例中所示),添加.sort_by{o|o.keys[0]}。现在是一团糟。:)

转换如下数组的最快/一行方式是什么:

[1,1,1,2,2,3,5,5,5,8,13,21,21,21]

…放入一组对象中,如下所示:


[{1=>4}、{2=>2}、{3=>1}、{5=>3}、{8=>1}、{13=>1}、{21=>3}]
array.injection({}){| h,v | h[v]| |=0;h[v]+=1;h}


不完全是这样,但几乎是

为了实现所需的格式,您可以在解决方案中附加一个map调用:

array.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }.map {|k, v| {k => v}}
虽然它仍然是一条单行线,但它开始变得凌乱起来

array.inject(Hash.new(0)) {|h,v| h[v] += 1; h }
虽然差别不大,但我更喜欢直截了当地说我在做什么。说
Hash.new(0)
替换
{}
h[v]|124;=0

需要1.8.7

a = [1, 1, 1, 1, 2, 2, 3, 5, 5, 5, 8, 13, 21, 21, 21]
h = {}
a.group_by {|e| e}.each {|k,v| h[k] = v.length}
p h  # => {5=>3, 1=>4, 2=>2, 13=>1, 8=>1, 3=>1, 21=>3}

你为什么问自己是否知道答案?回答自己的问题肯定不违法。SO FAQ甚至说,只要是问题格式,就可以。帮助其他人找到好信息。谁回答不重要。别担心,我不想到处写问题来回答我有答案的事情:)。甚至还有一个徽章叫自学者:用至少3张赞成票回答了你自己的问题,所以这里没有什么违法的。你可以使用一个默认值为:
array.inject(Hash.new(0)){h,v|h[v]的散列来清理一下+=1;h}.map{k,v{k=>v}}
并将其排序(如问题示例中所示),添加
.sort_by{o|o.keys[0]}
。现在是一团糟。:)