2017-12-25 14 views
-1

Hallo Ich schreibe eine Methode, die jedes Element in einem Array für ein bestimmtes Zeichen überprüfen und die Anzahl der Male zurückgeben muss, die das Zeichen insgesamt in der erscheint Elemente des Arrays.Zählen, wie oft ein Zeichen in einem Array von Strings in Ruby erscheint

Für die Erstellung squarenumbers Array Ich habe diesen Code:

squarenumbers = [] 
for k in 1..n 
    squarenumbers << k**2 
end 
squarenumbers.map { |a| a.to_s } 
d.to_s 

Und die Ziffer zu zählen, so weit habe ich geschrieben:

for k in 0..n-1 
    count =+1 if squarenumbers[k].include?"d" 
end 

ich eine Reihe von Größe erstellt haben n die Quadratzahlen enthalten, von 1 to n und ich habe jetzt Probleme zu zählen, wie oft die Zahl d in jedem Element erscheint.

Ich konvertierte d in eine Zeichenfolge in der Methode und kann nicht verstehen, warum die Zählung nicht funktioniert. Ich entschuldige mich, dass ich ein Anfänger bin, aber ich dachte, was ich geschrieben habe, würde jedes Element im Array nach dem Zeichen d überprüfen und jedes Mal, wenn eine Zeichenfolge es enthält, 1 zum Zähler hinzufügen.

Vielen Dank für Ihre Hilfe.

+0

ändern möchten auch Ihre 'squarenumbers' Array hinzuzufügen. – Manishh

+0

was macht d? Sie konvertieren es in eine Zeichenfolge? Warum? 2. Sache 'Quadratnummer.map {| a | a.to_s} 'ändert nicht' square_numbers' square_numbers ist immer noch ein Array von Zahlen. Die dritte Sache 'squadrennumbers [k]' wird '' '' 'nicht haben, so dass es immer 0 – Manishh

+0

@Manishh zurückgibt. Ich konvertierte d zu einer Zeichenkette, weil die Art, wie ich dies tun würde, die quadratischen Zahlen in Zeichenfolgen und konvertieren würde dann benutzen Sie include? um zu zählen, wie oft die Zahl d in den Zahlen erscheint, aber ich habe festgestellt, dass dies nicht funktioniert, da Wiederholungen nicht gezählt werden. Warum ändert die Karte die Elemente nicht? Muss ich das in einem separaten Array speichern? Warum gibt es Null zurück, wenn ich include verwende und jedes Element des Arrays überprüfe? – rb20

Antwort

0

Ich schreibe ein Verfahren, dass jedes Element in einem Array für ein gegebenes Zeichen und gibt die Anzahl, wie oft das Zeichen erscheint insgesamt in den Elementen des Arrays zu überprüfen braucht.

Angenommen, Sie haben ein Array von Strings, dann können Sie sum und count verwenden.

['hello','one','two'].sum { |s| s.count('o') } 
+1

Oder einfach '['Hallo', 'Eins', 'Zwei']. Join.count ('o')'. –

+0

@SagarPandya Vielen Dank für Ihre Antwort, ich habe meinen Code jetzt bearbeitet, die mit diesem \t squarenumbers = [] für k in 1..n \t squarenumbers << k ** 2 \t Ende Strings = Array.new Saiten = quadratnummer.map {| a | a.to_s} d.to_s print strings.count (d) Die Zählung kehrt zurück, aber warum? – rb20

1

Meine Antwort geht davon aus, dass das Problem wie folgt: „ein Array von natürlichen Zahlen gegeben (nicht-negative ganze Zahlen sind) und einer Ziffer d (eine Ganzzahl 0-9), um die Gesamtzahl von Ziffern berechnen gleich d für jedes Element des Arrays und Summe dieser Summen über alle Elemente des Arrays ".

Beachten Sie, dass sich diese Beschreibung nicht auf perfekte Quadrate bezieht. Das liegt daran, dass die Art und Weise, wie das Array natürlicher Zahlen aufgebaut ist, irrelevant ist.

Lassen Sie uns zunächst eine Methode erstellen, die berechnet, wie oft eine gegebene Ziffer d in einer natürlichen Zahl n erscheint.

def digit_in_number_count(n, digit) 
    n.digits.count(digit) 
end 

Siehe Integer#digits und Array#count.

Es ist jetzt nur eine Frage der Summe dieser Zählungen über alle Elemente im Array. Lassen Sie a eine Reihe von natürlichen Zahlen bezeichnen.

def digit_in_array_count(a, digit) 
    a.sum { |n| digit_in_number_count(n, digit) } 
end 

Siehe Array#sum.

Hier ist ein Beispiel.

a = [123425, 622252, 136407] 
digit = 2 

digit_in_number_count(123425, digit) 
    #=> 2 
digit_in_array_count(a, digit) 
    #=> 6 

Integer#digits und Array#sum gemacht beide ihr Debüt in Ruby v2.4.Um frühere Versionen von Ruby zu unterstützen, können Sie die Methoden wie folgt ändern.

def digit_in_number_count(n, digit) 
    n.to_s.count(digit.to_s) 
end 

def digit_in_array_count(a, digit) 
    a.reduce(0) { |t,n| t + digit_in_number_count(n, digit) } 
end 

Siehe Enumerable#reduce (a.k.a.inject) und String#count.

0

Für eine Reihe von Zahlen, die Sie tun können:

squarenumbers.sum {|e| e.to_a.count(d)} 

Wenn d numerisch ist, würden Sie es d.to_s

Verwandte Themen