2017-07-14 4 views
0

Utilisation de Ruby 2.4. J'ai un hachage avec des clés et des valeurs qui sont à la fois des nombres (entiers). Étant donné un ensemble de clés, comment puis-je trouver l'entrée (à la fois la clé et la valeur) qui a la valeur la plus faible? Si je voulais trouver la valeur minimum que je pouvais faireComment puis-je trouver les clés et la valeur dans un hachage avec la valeur minimale, seulement parmi certaines clés?

my_hash.select{|k, v| my_selected_keys.include?(k) }.values.min_by(&:last) 

Mais cela ne me prend la valeur, et non pas la clé et la valeur. Notez également que les valeurs de mon hash ne sont pas nécessairement uniques.

Répondre

0

Vous pouvez trier le hachage de la valeur, puis prendre le premier élément

my_hash.select{|k, _| my_selected_keys.include?(k) }.sort_by{|_, v| v}.first 
+0

Si je sauvé le résultat à un varaible, conseillerai-je accéder alors clé et valeur en exécutant "a.key" et "a.value"? –

+0

Non, mais la classe de hachage a '[]' pour tourner un tableau dans un hachage, de sorte que vous pouvez faire ceci: 'Hash [* my_hash.select {| k, _ | my_selected_keys.include? (k)} .sort_by {| _, v | v} .first] '(notez que vous devez ajouter l'opérateur splat (' * ') avant' my_hash' pour que cela fonctionne). – jerhinesmith

0

Voici une solution de rechange

hash.reduce([nil, Float::INFINITY]) { |acc, pair| acc[1] < pair[1] ? acc : pair } 
1

Vous pouvez mapper les clés sélectionnées sel_keys:

hash = {1 => 2, 3 => 1, 4 => 5, 5 => 1} 
sel_keys = [3, 4] 
sel_keys.map { |k| [k,hash[k]] }.min_by(&:last) #=> [3, 1] 

Avertissement: Renvoie uniquement la première clé trouvée avec la valeur min.

1

Est-ce que vous cherchez?

Il obtient toutes les clés qui ont la valeur minimale. J'ai divisé sur et nommé un grand nombre des objets intermédiaires pour plus de clarté:

hash = { 4 => 5, 2 => 9, 3 => 1, 8 => 5 } 
selected = Set[2, 4, 8] 

hash_subset = hash.slice(*selected) 
keys_by_value = hash_subset.group_by(&:last).each_value { |group| group.map!(&:first) } 

min_value, keys_with_min_val = keys_by_value.min_by(&:first) 
# => [5, [4, 8]] 

et oneliner rubis obligatoire:

hash.slice(*selected).group_by(&:pop).each_value(&:flatten!).min_by(&:first)