如何从Ruby中的哈希数组中获取唯一元素和数量?

时间:2012-07-17 13:15:11

标签: ruby-on-rails

我有一个哈希数组,我想要唯一的值并计算它。 我有:

a = [{:key => 2}, {:key => 1}, {:key => 4}, {:key => 1}]

我想看看:

a = [{:key => 2}, {:key => 1, :count =>2}, {:key => 4}]

4 个答案:

答案 0 :(得分:2)

试试这个:

a = [{:key => 2}, {:key => 1}, {:key => 4}, {:key => 1}]
b = a.clone
a.uniq!
a.inject([]) { |result,h| h[:count]=b.count(h) if b.count(h) > 1 ; result << h; result }

 => [{:key=>2}, {:key=>1, :count=>2}, {:key=>4}]

答案 1 :(得分:1)

你只需要迭代数组并计算每个键出现的次数,然后通过构建一个包含结果的新数组将它们加在一起。

以下代码段应该这样做。

a = [{:key => 2}, {:key => 1}, {:key => 4}, {:key => 1}]

counts = Hash.new(0)

a.map do |item|
  counts[item[:key]] += 1
end

a = counts.collect do |key, count|
  if count > 1
    {:key => key, :count => count}
  else
    {:key => key}
  end
end

答案 2 :(得分:0)

试试这个:

a.each {|h| count = a.count(h); if count > 1; dup_h = h.clone; h.merge!({:count => count}); a.delete(dup_h); end }

答案 3 :(得分:-1)

最简洁的方法(我认为)就是:

a.uniq.map{|hsh| c = a.count(hsh); c == 1 || hsh[:count] = c; hsh}

或者如果您不想修改:

中的哈希值
a.uniq.map{|hsh| h = hsh.dup; c = a.count(hsh); c == 1 || h[:count] = c; h}

产生不同结果的(略微)更漂亮的解决方案是:

a.uniq.group_by{|hsh| a.count(hsh)}
#=> {1=>[{:key=>2}, {:key=>4}], 2=>[{:key=>1}]}

查看Enumerable#countEnumerable#group_by上的文档,详细了解如何使用这些文档。
Ruby的核心实际上非常强大。