1

ハッシュの配列があり、一意の値が必要で、それを数えます。私は持っています:

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

私が見たい:

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

4 に答える 4

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}]
于 2012-07-17T13:38:07.283 に答える
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
于 2012-07-17T13:20:04.683 に答える
0

これを試して:

a.each {|h| count = a.count(h); if count > 1; dup_h = h.clone; h.merge!({:count => count}); a.delete(dup_h); end }
于 2012-07-18T08:18:09.713 に答える
-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#countおよびEnumerable#group_byのドキュメントを確認して、これらで何ができるかを確認してください。
Rubyのコアは実際には非常に強力です。

于 2012-07-17T13:58:45.853 に答える