[ruby-it] contare frequenza su array

Andrea Campi andrea.campi a zephirworks.com
Mer 4 Feb 2009 15:08:49 CET


On 2/4/09 2:19 PM, Giampiero Zanchi wrote:
> ciao a tutti
> sto imparando Ruby; per me uno degli aspetti più ostici è capire come
> produrre codice ben scritto; Ruby dà la libertà di scegliere fra tanti
> modi diversi per ottenere un certo risultato; rimane sempre il dubbio
> che esista una strada migliore di quella intrapresa; ad esempio, come si
> fa a ottenere la frequenza degli elementi di un array? personalmente ho
> prodotto il seguente codice:
> a = [1,2,3,4,1,2,3,1,2,1,5,5]
> b = {}
> a.uniq.each {|x| b[x] = a.find_all {|y| y == x}.size}
> p b
> che produce
> {5=>2, 1=>4, 2=>3, 3=>2, 4=>1}
> esistono modi più puliti o efficienti di ottenere lo stesso risultato?
> c'è modo di scrivere su un'unica riga la parte
> b = {}
> a.uniq.each {|x| b[x] = a.find_all {|y| y == x}.size}
> p b
>    

La soluzione più elegante che mi venga in mente su 2 piedi:

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


Una soluzione "offuscante" può essere:

b = Hash.new(0)
a.each { |x| b.merge!({x => 1}) { |k, o, n| o+n } }

Andrea


More information about the Ml mailing list