【发布时间】:2009-10-01 08:01:58
【问题描述】:
像这样转换数组的最快/单线方法是什么:
[1, 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}]
【问题讨论】:
像这样转换数组的最快/单线方法是什么:
[1, 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.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 }.map {|k, v| {k => v}}
.sort_by { |o| o.keys[0] } 添加到其中。 现在很乱。 :)
超级基础,终于懂注入了:
array.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }
不完全存在,但差不多
【讨论】:
array.inject(Hash.new(0)) {|h,v| h[v] += 1; h }
差别不大,但我更愿意明确说明我在做什么。说Hash.new(0) 替换{} 和h[v] ||= 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}
【讨论】: