# Contare frequenza su array

**URL:** <https://www.ruby-forum.com/t/contare-frequenza-su-array/159430>\
**Category:** IT\
**Created:** [February 4, 2009, 2:19pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430 "2009-02-04T14:19:01Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 2:19pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/1 "2009-02-04T14:19:01Z")

</div>

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  
?  
grazie

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 2:29pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/2 "2009-02-04T14:29:31Z")

</div>

On Wed, Feb 4, 2009 at 8:19 AM, Giampiero Z. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 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]

Io farei  
così:  
a.inject(Hash.new(0)) { |hash, item| hash[item] += 1; hash }

## Ciao, Antonio

[http://antoniocangiano.com](http://antoniocangiano.com) - Zen and the Art of Programming  
[http://math-blog.com](http://math-blog.com) - Mathematics is wonderful!  
[http://stacktrace.it](http://stacktrace.it) - Aperiodico di resistenza informatica  
Currently writing “Ruby on Rails for Microsoft Developers” for Wrox.

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 2:35pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/3 "2009-02-04T14:35:36Z")

</div>

Antonio C. wrote:

> Io farei  
> cosï¿½:  
> a.inject(Hash.new(0)) { |hash, item| hash[item] += 1; hash }
> 
> Ciao,  
> Antonio

intanto grazie mille per la pronta risposta  
ecco, avevo visto giusto che c’era una via piÃ¹ breve e pulita; anch’io  
avevo tentato la strada con inject, ma non avevo trovato il modo di  
indicare che volevo ‘totalizzare’ su un hash inizialmente vuoto; fra  
l’altro ho notato che se faccio precedere il tutto da p  
p a.inject(Hash.new(0)) { |hash, item| hash[item] += 1; hash }  
ottengo in output proprio l’hash; quindi la inject ritorna proprio  
l’oggetto su cui ho ‘totalizzato’;  
Ruby Ã¨ troppo perfetto! fa sempre quello che ti aspetti

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 2:41pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/4 "2009-02-04T14:41:58Z")

</div>

On Wed, Feb 4, 2009 at 8:37 AM, Giampiero Z. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Giampiero Z. wrote:  
> ah, no, l’ho capito solo ora; è grazie a ; hash alla fine del blocco che  
> ho l’hash come oggetto ritornato; dico bene? ho imparato un’altra cosa,

Esattamente. L’ultima espressione valutata nel blocco sarà il valore  
di ritorno per la prossima iterazione, per cui ci serve hash che  
agisce come accumulatore.

## Ciao, Antonio

[http://antoniocangiano.com](http://antoniocangiano.com) - Zen and the Art of Programming  
[http://math-blog.com](http://math-blog.com) - Mathematics is wonderful!  
[http://stacktrace.it](http://stacktrace.it) - Aperiodico di resistenza informatica  
Currently writing “Ruby on Rails for Microsoft Developers” for Wrox.

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 2:37pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/5 "2009-02-04T14:37:38Z")

</div>

Giampiero Z. wrote:  
ah, no, l’ho capito solo ora; Ã¨ grazie a ; hash alla fine del blocco che  
ho l’hash come oggetto ritornato; dico bene? ho imparato un’altra cosa,  
grazie di nuovo

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 3:09pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/6 "2009-02-04T15:09:23Z")

</div>

On 2/4/09 2:19 PM, Giampiero Z. wrote:

> 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

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 3:38pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/7 "2009-02-04T15:38:33Z")

</div>

Giampiero Z. wrote:

> > b = Hash.new(0)  
> > a.each { |x| b.merge!({x =\> 1}) { |k, o, n| o+n } }
> > 
> > Andrea  
> > grazie Andrea  
> > la tua prima soluzione Ã¨ praticamente identica a quella di Antonio; se  
> > si ripete mi sa che Ã¨ “la piÃ¹ giusta assai” 🙂  
> > per la seconda sono sempre qui che mi scervello, eppure funziona!!! piÃ¹  
> > che altro non capisco chi “chiama” il secondo blocco (?!?)

ah, ho capito; non conoscevo questa variante della merge; imparata una  
nuova cosa;  
grazie mille e a buon rendere (chissÃ ?!)  
Giampiero

---

<div class="post-metadata">

**Author:** ![giampiz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@giampiz](https://www.ruby-forum.com/u/giampiz)\
**Post date:** [February 4, 2009, 3:34pm UTC](https://www.ruby-forum.com/t/contare-frequenza-su-array/159430/8 "2009-02-04T15:34:13Z")

</div>

> 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  
> grazie Andrea  
> la tua prima soluzione Ã¨ praticamente identica a quella di Antonio; se  
> si ripete mi sa che Ã¨ “la piÃ¹ giusta assai” 🙂  
> per la seconda sono sempre qui che mi scervello, eppure funziona!!! piÃ¹  
> che altro non capisco chi “chiama” il secondo blocco (?!?)
