Ruby分组元素

时间:2015-02-06 22:37:50

标签: arrays ruby group-by grouping

我有阵列:

a = [1, 3, 1, 3, 2, 1, 2] 

我希望按值分组,但保存索引,因此结果必须如下所示:

[[0, 2, 5], [1, 3], [4, 6]]

或哈希

{1=>[0, 2, 5], 3=>[1, 3], 2=>[4, 6]} 

现在我使用的是非常丑陋且代码很大的代码:

struc = Struct.new(:index, :value)
array = array.map.with_index{ |v, i| struc.new(i, v) }.group_by {|s| s[1]}.map { |h| h[1].map { |e| e[0]}}

`

3 个答案:

答案 0 :(得分:2)

a = [1, 3, 1, 3, 2, 1, 2]
a.each_with_index.group_by(&:first).values.map { |h| h.map &:last }

首先我们在Enumerator[val, idx], ...)的格式中获得each_with_index,然后在group_by中获得值first的值,然后取每对的索引(last元素。)

答案 1 :(得分:2)

如果使用具有默认值的哈希值,则避免在元素上迭代两次:

a = [1, 3, 1, 3, 2, 1, 2]

Hash.new { |h, k| h[k] = [] }.tap do |result|
  a.each_with_index { |i, n| result[i] << n }
end
#=> { 1 => [0, 2, 5], 3 => [1, 3], 2 => [4, 6] }

答案 2 :(得分:0)

您可以使用:

a = [1, 3, 1, 3, 2, 1, 2]

a.each_with_index.group_by(&:first).values.map { |b| b.transpose.last }
  #=> [[0, 2, 5], [1, 3], [4, 6]]