54 votes

Comment grouper par nombre dans un tableau sans utiliser de boucle ?

arr = [1,2,1,3,5,2,4]

Comment puis-je compter le tableau par valeur de groupe avec tri ? J'ai besoin de la sortie suivante :

x[1] = 2  
x[2] = 2  
x[3] = 1  
x[4] = 1  
x[5] = 1

11voto

rubyprince Points 7665
x = Hash[arr.uniq.map{ |i| [i, arr.count(i)] }]

Le dernier Ruby a to_h méthode :

x = arr.uniq.map{ |i| [i, arr.count(i)] }.to_h

11voto

EliadL Points 562
arr.group_by(&:itself).transform_values(&:size)
#=> {1=>2, 2=>2, 3=>1, 5=>1, 4=>1}

6voto

kurumi Points 10096

Je suis sûr qu'il existe de meilleurs moyens,

>> arr.sort.group_by {|x|x}.each{|x,y| print "#{x} #{y.size}\n"}
1 2
2 2
3 1
4 1
5 1

assigner les valeurs x et y à un hash selon les besoins.

6voto

erasing Points 71

Juste pour info, j'ai récemment lu Object#tap aquí . Ma solution serait :

Hash.new(0).tap{|h| arr.each{|i| h[i] += 1}}

El #tap transmet l'appelant au bloc et le renvoie ensuite. C'est très pratique lorsque vous devez construire un tableau ou un hash de manière incrémentielle.

5voto

ThoKra Points 1706

Cela devrait le faire

arr = [1,2,1,3,5,2,4]

puts arr.inject(Hash.new(0)) {|h, v| h[v] += 1; h}
#=> {1=>2, 2=>2, 3=>1, 5=>1, 4=>1}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X