2012-01-31 17 views
0

私は数えたいオブジェクトの配列を持っています。例えば:アレイを変換してカウントする効率的な方法は何ですか?

[#<User id:1, count:0>, #<User id:2, count:0>, #<User id:2, count:0>, #<User id:3, count:0>, #<User id:1, count:0>, #<User id:1, count:0>] 

になるでしょう:

[#<User id:1, count:3>, #<User id:2, count:2>, #<User id:3, count:1>] 

変換は、「マップ」以来、私は混乱するものですストレートになりますが、これは再帰的になります。

+1

入力は常に0をカウントしていますか?そうでない場合は、それらの合計を求めますか? –

+0

入力回数はゼロではないかもしれません。私はそれらの合計が必要ないので、回答はうまくいくはずです。説明を求めてくれてありがとう。 – Inc1982

答えて

2
[user1, user2, user2, user3, user1, user1].group_by(&:id).map do |id, users| 
    users.first.count = users.size 
    users.first 
end 
+0

ニース。しかし、それは単に変換しているので、マップはマップよりも意味があります。 – pguardiario

+0

@pguardiarioそれは、3要素配列OPの返す –

+0

を返すええと、彼は、配列を数えて変換し、新しいものを返さないように頼んだ。 – pguardiario

0
[user1, user2, user2, user3, user1, user1] \ 
    .group_by(&lambda{|x| x}) \ 
    .map{ |k, v| k.count = v.count; k } 
+0

Ruby 1.9.2以降ではFYIと同様に、継続文字「\」を必要としません。 1.8.7はまだそれを必要とします。 –

関連する問題