Erstellen hash aus array und Frequenz
Ich habe ein array [1,2,4,5,4,7]
und ich will zu finden, die die Häufigkeit jeder Zahl und speichern in einem hash. Ich habe diesen code, aber es gibt NoMethodError: undefined method '+' for nil:NilClass
def score( array )
hash = {}
array.each{|key| hash[key] += 1}
end
Gewünschte Ausgabe
{1 => 1, 2 => 1, 4 => 2, 5 => 1, 7 => 1 }
- Herr, einige empfehlen die Verwendung von Spritzen (auch reduziert), was in Ordnung ist, aber alles, was Sie tun müssen ist, ändern
hash = {}
zuhash = Hash.new(0)
. Das sagt Ruby, dass, wenn es trifft aufhash[key]
in einem Kontext, wo es muss einen Wert haben (wiehash[key] += 1
oderv = hash[key]
) und der hash nicht enthalten, die Tastekey
, es istkey=>0
zu den Hashwert vor der Einnahme von weiteren Maßnahmen (wiehash[key] += 1
). Auf der anderen Seiteif hash[key] == 7
bewerten zuif nil == 7
wennkey
ist nicht in der hash -;key=>0
werden nicht Hinzugefügt, um den hash. - Schöne Lehre...!! Es mochte.. +1.
- das problem ist möglicherweise das gleiche, aber nicht die Frage. Hier, Herr. möchte wissen, warum bekam er eine Fehlermeldung, die scheint mir Recht ligit.
- fair genug, dann sagen wir es 🙂 stackoverflow.com/questions/9480852/array-to-hash-words-count
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun, wie unten :
Oder mehr Rubyish mit
Enumerable#each_with_object
:hash = {}
ist eine leer,mit Standard-Wert alsnil
.nil
ist eine Instanz vonNilclass
,undNilClass
keine Instanz-Methode aufgerufen#+
. Du hast also dieNoMethodError
.Blick auf die
Hash::new
Dokumentation :Verwenden Sie einfach injizieren. Diese Art der Anwendung ist genau das, was es für gemeint.
So etwas wie:
In Ruby 2.4+:
Liebe mich einige injizieren:
results = array.inject(Hash.new(0)) {|hash, arr_element| hash[arr_element] += 1; hash }
each_with_object
:a.each_with_object(Hash.new(0)) { |e, h| h[e] += 1 }
inject
für "Iteration mit feedback" - Situationen undeach_with_object
für "Durchlaufen und sammeln" - Situationen. Ich müde von der; hash
Zeug.Hier ist eine kurz-option, die verwendet die Hash-array-Initialisierer
Der Punkt hier ist, dass
hash[1]
existiert nicht (nil
) wenn es zum ersten mal sieht1
im array.Müssen Sie es initialisieren irgendwie, und
hash = Hash.new(0)
ist der einfachste Weg.0
ist der erste Wert, den Sie wollen, in diesem Fall.Ruby 2.7 ab haben die
Enumerable#tally
Methode, mit der man dieses Problem lösen.Vom Stamm Dokumentation:
Oder verwenden Sie die group by-Methode: