[RUBY] Wie man Hash benutzt

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.

Annahme

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.

Eingang

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

Ausgabe

B C A

Wie löst man

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

Kommentar

Kommentar 1

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}

Kommentar 2

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.

Kommentar 3

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

Wie man Hash benutzt
Verwendung von Map
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
Verwendung der Ketten-API
[Java] Verwendung von Map
Verwendung der Warteschlange mit Priorität
[Rails] Verwendung von Enum
Verwendung von Java Optional
Verwendung von JUnit (Anfänger)
Verwendung von Ruby return
[Rails] Verwendung von Enum
Verwendung von @Builder (Lombok)
Wie man Big Decimal benutzt
[Java] Verwendung von removeAll ()
Verwendung von String [] args
Verwendung von Java Map
Ruby: Wie man Cookies benutzt
Verwendung von abhängigen :: zerstören
Verwendung von Eclipse Debug_Shell
Verwendung von Apache POI
[Rails] Verwendung der Validierung
Verwendung von Java-Variablen
[Rails] So verwenden Sie authenticate_user!
Verwendung von GC Viewer
Wie man Lombok jetzt benutzt
[Erstellen] Verwendung von JUnit
[Schienen] Verwendung von Scope
Verwendung der link_to-Methode
[Rails] Wie man Edelstein "devise" benutzt
Wie man Lombok im Frühling benutzt
Verwendung von StringBurrer und Arrays.toString.
Verwendung des Arrays (persönliches Memorandum)
Verwendung von HttpClient (Get) von Java
Verwendung des Bereichs (JSP & Servlet)
Verwendung der include? -Methode