2009-10-01 15 views

Respuesta

5

para lograr su formato deseado, se puede añadir una llamada a asignar a su solución:

array.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }.map {|k, v| {k => v}} 

Aunque todavía es una sola línea, que comienza a causar problemas.

+0

bueno, eso es todo! Gracias. –

+3

Puede limpiar eso un poco usando un hash con un valor predeterminado: 'array.inject (Hash.new (0)) {| h, v | h [v] + = 1; h} .map {| k, v | {k => v}} ' – rampion

+0

Y para ordenarlo (como en el ejemplo de la pregunta), agregue' .sort_by {| o | o.keys [0]} 'a él. * Ahora * está desordenado. :) –

5

súper básico, por último entendemos inyectar: ​​

array.inject({}) { |h,v| h[v] ||= 0; h[v] += 1; h }

No del todo, pero casi

+0

¿por qué preguntas si conoce la respuesta? –

+2

Definitivamente no es ilegal responder a su propia pregunta. Las preguntas frecuentes de SO aún dicen que está bien, siempre y cuando esté en formato de pregunta. – Twisol

+1

para ayudar a otras personas a encontrar buena información. no importa quién lo conteste. no te preocupes, no tengo el deseo de escribir preguntas sobre cosas para las que tengo respuestas :). –

5
array.inject(Hash.new(0)) {|h,v| h[v] += 1; h } 

No es una gran diferencia pero prefiero ser explícito con lo que estoy haciendo. Diciendo Hash.new(0) modifica al {} y h[v] ||= 0

+0

allí está, perfecto. gracias Ryan. –

4

Requiere 1.8.7

a = [1, 1, 1, 1, 2, 2, 3, 5, 5, 5, 8, 13, 21, 21, 21] 
h = {} 
a.group_by {|e| e}.each {|k,v| h[k] = v.length} 
p h # => {5=>3, 1=>4, 2=>2, 13=>1, 8=>1, 3=>1, 21=>3} 
Cuestiones relacionadas