2009-10-01 8 views

risposta

5

per raggiungere il vostro formato desiderato, è possibile aggiungere una chiamata a mappare la vostra soluzione:

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

Anche se è ancora un one-liner, comincia a diventare disordinato.

+0

bello, questo è tutto! Grazie. –

+3

Puoi pulirlo un po 'usando un hash con un valore predefinito: 'array.inject (Hash.new (0)) {| h, v | h [v] + = 1; h} .map {| k, v | {k => v}} ' – rampion

+0

E per ottenerlo ordinato (come nell'esempio di domanda), aggiungi' .sort_by {| o | o.keys [0]} 'ad esso. * Ora * è disordinato. :) –

5

super-base, finalmente capire iniettare:

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

Non del tutto lì, ma quasi

+0

perché me lo chiedi, se si conosce la risposta? –

+2

Ovviamente non è illegale rispondere alla tua stessa domanda. Le FAQ SO dicono anche che va bene, purché sia ​​in un formato di domanda. – Twisol

+1

per aiutare altre persone a trovare buone informazioni. non importa chi lo risponda. non ti preoccupare, non ho il desiderio di andare in giro a scrivere domande alle cose per cui ho delle risposte allineate :). –

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

Non un'enorme differenza, ma preferisco essere esplicito con quello che sto facendo. Dire Hash.new(0) sostituisce {} e h[v] ||= 0

+0

eccolo, perfetto. grazie Ryan. –

4

Richiede 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} 
Problemi correlati