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.
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.
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
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} #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
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}
À 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.
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