2009-10-01 10 views

Odpowiedz

5

Aby osiągnąć żądany format, można dołączyć wezwanie do map do rozwiązania:

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

Mimo to nadal jest jeden-liner, zaczyna się bałagan.

+0

fajnie, to wszystko! dzięki. –

+3

Możesz to trochę wyczyścić za pomocą skrótu z wartością domyślną: 'array.inject (Hash.new (0)) {| h, v | h [v] + = 1; h} .map {| k, v | {k => v}} ' – rampion

+0

Aby je posortować (jak w przykładzie pytania), dodaj' .sort_by {| o | o.keys [0]} 'to. * Teraz * jest brudny. :) –

5

bardzo podstawowe, wreszcie zrozumieć wtrysku:

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

Nie całkowicie tam, ale niemal

+0

dlaczego pytasz, jeśli znasz odpowiedź? –

+2

Oczywiście nie jest nielegalne, aby odpowiedzieć na własne pytanie. W Najczęściej zadawanych pytaniach jest napisane, że wszystko jest w porządku, o ile jest w formacie pytań. – Twisol

+1

, aby pomóc innym znaleźć dobre informacje. nie ma znaczenia, kto na nie odpowie. nie martw się, nie mam ochoty chodzić na pisanie pytań do rzeczy, na które mam odpowiedzi w kolejce :). –

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

Niezbyt duża różnica, ale wolę być jednoznaczna z tym, co robię. Mówiąc Hash.new(0) zastępuje {} i h[v] ||= 0

+0

to jest idealne. dzięki Ryan. –

4

Wymaga 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} 
Powiązane problemy