2017-10-10 5 views
0

J'ai un hachage qui mappe des entiers à des tableaux. Par exempleComment puis-je parcourir un hachage jusqu'à ce que je trouve un élément correspondant?

{1 => ["abc"], 2 => ["ccc", "ddd"]} 

Comment puis-je itérer le hachage jusqu'à ce que je trouve une entrée dans laquelle la valeur a seulement une taille de tableau de 1? Normalement je pourrais faire

arr.detect{|element| element.size == 1} 

mais cela ne fonctionne que pour les tableaux. Je ne suis pas sûr de savoir comment appliquer une logique similaire aux hachages.

+1

Jetez un oeil à la [réponse à votre question précédente] (https://stackoverflow.com/a/46656045/477037) - hashes take ** deux arguments ** dans ces méthodes, la clé et sa valeur, c'est-à-dire 'detect {| k, v | ...} ' – Stefan

Répondre

2

Le même principe s'applique:

h = {1 => ["abc"], 2 => ["ccc", "ddd"]} 

h.find do |_, l| 
    l.size == 1 
end 
# => [ 1, ["abc"]] 

Maintenant, si vous êtes à la recherche que comme un ensemble plus variables utiles:

key, value = h.find do |_, l| 
    l.size == 1 
end 
# => [ 1, ["abc"]] 
key 
# => 1 
value 
# => ["abc"] 

Si vous ne vous préoccupez des valeurs, il est encore plus facile:

list = h.values.find do |l| 
    l.size == 1 
end 
+1

La syntaxe' do ... end' est un peu inhabituelle ici, étant donné l'affectation et le contenu du bloc très court. – Stefan

+0

@Stefan C'est la version longue de '{...}' qui tend à rendre beaucoup plus clair ce qui se passe à l'intérieur car il est exposé sur sa propre ligne. Cela rend également l'ajout de commentaires plus facile. – tadman