Ich habe oft Arrays verwendet, aber Als ich ein bestimmtes Problem löste, konnte ich es nicht allein mit dem Array lösen. Ich konnte es mit einem Hash lösen. Ein Hinweis zu diesem Lernen.
Erstellen Sie ein Buchkaufkostenranking für Herrn A, Herrn B und Herrn C. Es gibt drei Ingenieure namens Mr. A, Mr. B und Mr. C. Buchkaufkosten von 1000 Yen, 3000 Yen bzw. 2000 Yen. In diesem Fall steht Herr B auf dem 1. Platz, Herr C auf dem 2. Platz und Herr A auf dem 3. Platz.
Angesichts des Namens jedes Ingenieurs und der Buchkaufinformationen, Erstellen Sie aus diesen Informationen ein Buchkaufkostenranking.
3-> Anzahl der Ingenieure (Anzahl der Ingenieure) A B C-> Name des Ingenieurs (name_of_engineers) 4-> Anzahl der von Ingenieuren gekauften Bücher (Anzahl der Bücher) A 1000-> Der Name des Ingenieurs, der das Buch gekauft hat, und der Preis des Buches (Name, Preis) B 1000 B 2000 C 2000
B C A
number_of_engineers = gets.to_i
name_of_engineers = gets.to_s.split(" ")
number_of_books = gets.to_i
name_n_price = {}
name_of_engineers.each{|name| name_n_price[name] = 0} #Kommentar 1
number_of_books.times do
name, price = gets.to_s.split(" ")
name_n_price.each_key{ |i| name_n_price[i] += price.to_i if i == name} #Kommentar 2
end
puts name_n_price.sort_by{ |name, price| -price}.to_h.keys #Kommentar 3
Ein leerer Hash wird vorab mit "name_n_price" generiert. Die Namen der Ingenieure lauten derzeit wie folgt:
name_of_engineers = ["A", "B", "C"]
Holen Sie sich die Elemente (A, B, C) dieses Arrays mit jeder Methode und fügen Sie sie als Schlüssel in name_n_price hinzu. Da zu diesem Zeitpunkt name_n_price [name] = 0 ist, hat jeder Schlüssel den Wert 0. Danach wird "A 1000" usw. eingegeben, sodass der Anfangswert wie oben beschrieben eingestellt wird. Durch die obige Operation wird "name_n_price" wie folgt.
name_n_price = {"A"=> 0, "B"=> 0, "C"=> 0}
Geben Sie unter number_of_books.times do ~ end insgesamt viermal "A 1000" usw. ein. (Diesmal number_of_books = 4) Generieren Sie die folgende Sequenz mit dem Namen price = gets.to_s.split ("").
name, price = ["A", "1000"]
Fügen Sie als Nächstes einen Wert für jeden Schlüssel im Hash von name_n_price hinzu. Daher erhalte ich mit jeder Methode jedes Element in name_n_price. Dieses Mal erhalten wir nur den Schlüssel. Der Grund ist, wenn Sie verstehen, dass Sie dem Hash-Schlüssel Werte hinzufügen Ich werde es überprüfen.
irb(main):011:0> h = {}
=> {}
irb(main):012:0> h[:name] = "suzuki"
=> "suzuki"
irb(main):013:0> p h
{:name=>"suzuki"}
=> {:name=>"suzuki"}
Kurz gesagt, wenn Sie einen Schlüssel haben (in diesem Fall "Name"), können Sie ihn hinzufügen, indem Sie einen Wert angeben (in diesem Fall "suzuki").
Verwenden Sie daher "name_n_price.each_key {}". Es gibt auch each_value, der nur den Wert abruft.
Dann ist für name_n_price = {"A" => 0, "B" => 0, "C" => 0} Ich möchte einen Wert hinzufügen, wenn er Herrn A entspricht, also werde ich in wenigen Minuten eine bedingte Verzweigung durchführen. Es ist wie folgt.
if i == name
Hier ist "i" A, B, C. ( each_Ich habe den Schlüssel mit Schlüssel bekommen{ |i| ~ }Denn es ist
Fügen Sie den zuletzt eingegebenen Preis hinzu.
name_n_price[i] += price.to_i
Wenn Sie das oben genannte zerlegen und schreiben,
name_n_price[i] = name_n_price[i] + price.to_i
Wenn Sie es als zugewiesenen Wert schreiben
name_n_price[A] = 0 + 1000
Damit
name_n_price = {"A"=> 0, "B"=> 0, "C"=> 0}
Aber
name_n_price = {"A"=> 1000, "B"=> 0, "C"=> 0}
Wird sein.
Wenn Sie dies noch dreimal wiederholen, erhalten Sie
name_n_price = {"A"=> 1000, "B"=> 3000, "C"=> 2000}
Wird sein.
Schließlich wird für name_n_price der Schlüssel (Name) in der Reihenfolge von der Person mit dem größten Betrag ausgegeben.
Wir möchten sort_by verwenden, da die Beträge im Hash in absteigender Reihenfolge vorliegen sollen. Es gibt auch eine Sortierung, aber dies ist eine Schlüsselsortierung, sodass sie diesmal nicht verwendet werden kann.
Übrigens sieht es bei Verwendung so aus.
irb(main):017:0> h = {"z" => 1, "f" => 3, "a" => 5}
=> {"z"=>1, "f"=>3, "a"=>5}
irb(main):018:0> h.sort
=> [["a", 5], ["f", 3], ["z", 1]]
Die Tasten sind alphabetisch sortiert.
Sie können die Werte in absteigender Reihenfolge wie folgt einstellen.
name_n_price.sort_by{ |name, price| -price}
irb(main):019:0> name_n_price = {"A"=> 1000, "B"=> 3000, "C"=> 2000}
=> {"A"=>1000, "B"=>3000, "C"=>2000}
irb(main):020:0> name_n_price.sort_by{ |name, price| -price}
=> [["B", 3000], ["C", 2000], ["A", 1000]]
Nachdem wir sortiert haben, werden die Elemente aus dem Hash im Array gespeichert. Dies geschieht, wenn Sie sort_by oder sort ausführen. Ich weiß nicht warum.
Unter dieser Bedingung möchte ich also nur den Schlüssel bekommen Holen Sie sich den Schlüssel zurück in das Array zu Hash.
Verwenden Sie die Methode to_h, um ein Array in einen Hash zu konvertieren.
name_n_price.sort_by{ |name, price| -price}.to_h
=> {"B"=>3000, "C"=>2000, "A"=>1000}
Außerdem möchte ich nur die Schlüssel, also verwende ich die Schlüsselmethode.
name_n_price.sort_by{ |name, price| -price}.to_h.keys
=> ["B", "C", "A"]
Die Puts-Methode unterbricht die Linie. Wenn Sie also das Obige mit Puts ausgeben, Die Antwort ist wie erwartet.
das ist alles.
Recommended Posts