[RUBY] Comment utiliser le hachage

J'utilisais beaucoup les tableaux, mais Lorsque je résolvais un certain problème, je ne pouvais pas le résoudre avec le tableau seul. J'ai pu le résoudre avec un hachage. Une note sur cet apprentissage.

supposition

Créez un classement des coûts d'achat de livres pour M. A, M. B et M. C. Il y a trois ingénieurs nommés M. A, M. B et M. C. Les frais d'achat du livre sont respectivement de 1000 yens, 3000 yens et 2000 yens. Dans ce cas, M. B est à la première place, M. C est à la deuxième place et M. A est à la troisième place.

Étant donné le nom de chaque ingénieur et les informations d'achat du livre, Créez un classement des coûts d'achat de livres à partir de ces informations.

contribution

3-> Nombre d'ingénieurs (number_of_engineers) A B C-> Nom de l'ingénieur (nom_des_ingénieurs) 4-> Nombre de livres achetés par les ingénieurs (nombre_de_ livres) A 1000-> Le nom de l'ingénieur qui a acheté le livre et le prix du livre (nom, prix) B 1000 B 2000 C 2000

production

B C A

Comment résoudre

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}  #Commentaire 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}  #Commentaire 2
end
puts name_n_price.sort_by{ |name, price| -price}.to_h.keys  #Commentaire 3

Commentaire

Commentaire 1

Un hachage vide est généré à l'avance avec "nom_n_prix". Les noms des ingénieurs sont actuellement les suivants:

name_of_engineers = ["A", "B", "C"]

Récupérez les éléments (A, B, C) de ce tableau avec la méthode each et ajoutez-les comme clés dans name_n_price. De plus, à ce moment, puisque name_n_price [name] = 0, chaque clé a une valeur de 0. Après cela, "A 1000" etc. sera entré, de sorte que la valeur initiale est définie comme décrit ci-dessus. Par l'opération ci-dessus, "name_n_price" devient comme suit.

name_n_price = {"A"=> 0, "B"=> 0, "C"=> 0}

Commentaire 2

À number_of_books.times do ~ end, entrez "A 1000" etc. un total de 4 fois. (Cette fois, number_of_books = 4) Générez la séquence suivante avec le nom, price = gets.to_s.split ("").

name, price = ["A", "1000"]

Ensuite, ajoutez une valeur pour chaque clé dans le hachage de name_n_price. Par conséquent, j'obtiens chaque élément dans name_n_price avec chaque méthode. Cette fois, nous n'obtiendrons que la clé. La raison est que si vous comprenez que vous ajoutez des valeurs à la clé de hachage Je vais l'examiner.

irb(main):011:0> h = {} 
=> {}
irb(main):012:0> h[:name] = "suzuki"
=> "suzuki"
irb(main):013:0> p h
{:name=>"suzuki"}
=> {:name=>"suzuki"}

Bref, si vous avez une clé ("nom" dans ce cas), vous pouvez l'ajouter en spécifiant une valeur ("suzuki" dans ce cas).

Par conséquent, utilisez "name_n_price.each_key {}". Il existe également each_value qui récupère uniquement la valeur.

Ensuite, pour name_n_price = {"A" => 0, "B" => 0, "C" => 0}, Je veux ajouter une valeur quand cela correspond à M. A, donc je vais faire une succursale conditionnelle en si minutes. C'est comme suit.

if i == name

Ici, "i" est A, B, C. ( each_J'ai la clé avec la clé{ |i| ~ }Parce que c'est

Ajoutez le dernier prix entré.

name_n_price[i] += price.to_i

Si vous démontez ce qui précède et l'écrivez,

name_n_price[i] = name_n_price[i] + price.to_i

Si vous l'écrivez comme une valeur assignée

name_n_price[A] = 0 + 1000

Alors

name_n_price = {"A"=> 0, "B"=> 0, "C"=> 0}

Mais

name_n_price = {"A"=> 1000, "B"=> 0, "C"=> 0}

Sera.

Répéter cela trois fois de plus entraînera

name_n_price = {"A"=> 1000, "B"=> 3000, "C"=> 2000}

Sera.

Commentaire 3

Enfin, pour name_n_price, la clé (nom) est sortie dans l'ordre de la personne avec le plus grand montant.

Nous voulons utiliser sort_by car nous voulons que les montants du hachage soient dans l'ordre décroissant. Il existe également un tri, mais il s'agit d'un tri par clé, il ne peut donc pas être utilisé cette fois.

Au fait, il ressemble à ceci lorsqu'il est utilisé.

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

Les clés sont classées par ordre alphabétique.

Vous pouvez définir les valeurs dans l'ordre décroissant en procédant comme suit.

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

Maintenant que nous avons trié, les éléments sont stockés dans le tableau à partir du hachage. Cela se produit lorsque vous exécutez sort_by ou sort. Je ne sais pas pourquoi.

Dans cette condition, je veux obtenir uniquement la clé, donc Récupérez la clé dans le tableau pour le hachage.

Pour convertir un tableau en hachage, utilisez la méthode to_h.

name_n_price.sort_by{ |name, price| -price}.to_h
=> {"B"=>3000, "C"=>2000, "A"=>1000}

De plus, je ne veux que les clés, donc j'utilise la méthode des clés.

name_n_price.sort_by{ |name, price| -price}.to_h.keys
=> ["B", "C", "A"]

La méthode put cassera la ligne, donc si vous sortez ce qui précède avec put, La réponse est celle attendue.

c'est tout.

Recommended Posts

Comment utiliser le hachage
Comment utiliser Map
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser l'API Chain
[Java] Comment utiliser Map
Comment utiliser Queue avec priorité
[Rails] Comment utiliser enum
Comment utiliser java Facultatif
Comment utiliser JUnit (débutant)
Comment utiliser le retour Ruby
[Rails] Comment utiliser enum
Comment utiliser @Builder (Lombok)
Comment utiliser Big Decimal
[Java] Comment utiliser removeAll ()
Comment utiliser String [] args
Comment utiliser Java Map
Ruby: Comment utiliser les cookies
Comment utiliser Dependant :: Destroy
Comment utiliser Eclipse Debug_Shell
Comment utiliser Apache POI
[Rails] Comment utiliser la validation
Comment utiliser les variables Java
[Rails] Comment utiliser authenticate_user!
Comment utiliser GC Viewer
Comment utiliser Lombok maintenant
[Création] Comment utiliser JUnit
[Rails] Comment utiliser Scope
Comment utiliser la méthode link_to
[Rails] Comment utiliser la "devise" des gemmes
Comment utiliser Lombok au printemps
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser le tableau (mémorandum personnel)
Comment utiliser HttpClient de Java (Get)
Comment utiliser scope (JSP & Servlet)
Comment utiliser la méthode include?