在Ruby Array中收集重复项的最快/一线方式?

Lan*_*ard 5 ruby arrays

像这样转换数组的最快/单线方式是什么:

[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}]

Lan*_*ard 5

超级基础,最后了解注入:

array.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }

不完全在那里,但差不多

  • 回答你自己的问题肯定不是违法的.SO FAQ甚至表示没问题,只要它是问题格式. (2认同)

jgr*_*gre 5

要获得所需的格式,您可以附加调用以映射到您的解决方案:

array.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }.map {|k, v| {k => v}}
Run Code Online (Sandbox Code Playgroud)

虽然它仍然是单行,但它开始变得混乱.

  • 您可以使用具有默认值的哈希值来清理它:`array.inject(Hash.new(0)){| h,v | h [v] + = 1; h} .map {| k,v | {k => v}}` (3认同)

小智 5

array.inject(Hash.new(0)) {|h,v| h[v] += 1; h }
Run Code Online (Sandbox Code Playgroud)

没有太大的区别,但我更愿意明确我正在做的事情.说Hash.new(0)替换{}h[v] ||= 0