2
votes

Itérer sur un hachage avec des tableaux comme valeur

Je demande à un utilisateur la clé currentline et la valeur currentstation afin de la comparer à un hachage et d'afficher la ligne à parcourir.

mtahash = {
  n: ["timesq", "34thn", "28thn", "23rdn", "Union_Square", "8th"],
  l: ["8th", "6th", "Union_Square", "3rd", "1st"],
  s: ["Grand Central", "33rds", "28th", "23rds", "Union Square", "Astor Place"]
}

puts "Please enter your current station"
current_station = gets.chomp
puts "Please enter your current line"
current_line = gets.chomp

mtahash.each do |key, value|
  if key == current_line && value == current_station
    puts "got it"
  else
    puts "fish"
  end
end


2 commentaires

c'est une chaîne et devrait être n'importe quelle valeur du hachage


Je suis très nouveau dans l'apprentissage du codage et du rubis pour être précis - c'est tellement à apprendre mais j'apprends et j'y arriverai éventuellement. :)


3 Réponses :


1
votes

Une valeur dans cette itération est un tableau. Vous devriez vérifier s'il inclut le nom de la station, pas s'il lui est égal. Transformez également la clé en chaîne avec key.to_s (c'est un symbole maintenant):

 mtahash.each do |key, value|
   if key.to_s == current_line && value.include?(current_station)
     puts "got it"
   else
     puts "fish"
   end
 end


5 commentaires

corrigé la faute de frappe.


Cela va s'exécuter une fois pour chaque clé dans mtahash . Par exemple, current_line = 'n', current_station = '8th' => a obtenu \ n fish \ n fish . Est-ce la fonctionnalité prévue?


@Tom est aussi proche que possible de la solution originale.


@mrzasa était juste curieux de savoir ce que Fahz dirait qu'il recherchait. Rien contre ta réponse.


pour l'instant, oui, c'est la seule chose à exécuter @Tom



0
votes

each va itérer pour chaque valeur de clé (même si une correspondance est trouvée) mais detect s'arrêtera une fois qu'il aura trouvé une correspondance.

Je pense que les clés pour le hachage est unique donc detect est mieux que d'utiliser each

 > mtahash = {:n=>["timesq", "34thn", "28thn", "23rdn", "Union_Square", "8th"], :l=>["8th", "6th", "Union_Square", "3rd", "1st"], :s=>["Grand Central", "33rds", "28th", "23rds", "Union Square", "Astor Place"]} 
 >   current_line, current_station = 'l', '3rd'
 => ["l", "3rd"] 

 > mtahash.detect { |k, v| k.to_s == current_line && v.include?(current_station) } ? 'got it' : 'fish'
 => "got it" 

 > current_line, current_station = 'l', '43rd'
 => ["l", "43rd"] 

 > mtahash.detect { |k, v| k.to_s == current_line && v.include?(current_station) } ? 'got it' : 'fish'
 => "fish" 

Réduisez les itérations.

mtahash.detect { |k, v| k.to_s == current_line && v.include?(current_station) } ? 'got it' : 'fish'


7 commentaires

Cette ligne de code est compréhensible mais ne fonctionne toujours pas. La sortie est toujours poisson 3 fois quelle que soit l'entrée


@fahz c'est impossible ce que vous avez dit, vérifiez le journal mis à jour dans ma réponse


cela ne fonctionne pas à coup sûr à ma fin .. ne donne aucune sortie sauf pour fish: ((((((((


@fahz parce que vous n'avez pas fourni ce que votre hachage a! par exemple. n et 23rdn


Qu'est-ce que cela veut dire? Le hachage est déjà défini en haut. J'essaie également le code sans entrée de l'utilisateur. Je suis juste en train de le coder en dur, mais cela ne fonctionne toujours pas - qu'est-ce que je fais de mal?


@fahz, vous devez publier votre current_line , current_station ici


continuons cette discussion dans le chat .



0
votes

Je suggère de convertir en_sym ( String # to_sym ) l'entrée utilisateur pour current_line, puisque les clés de hachage sont des symboles.

Ensuite, vérifiez si le hachage a cette clé ( Hash # has_key ).

Enfin, accédez au hachage par et vérifiez si le tableau inclut ( Array # include ) la station_actuelle , car les valeurs du hachage sont des tableaux.

Ceci n'est qu'un extrait de code à titre d'exemple.

current_station = "timesq" # gets.chomp
current_line = "n".to_sym  # gets.chomp.to_sym <--- note .to_sym

if mtahash.has_key? current_line
    if mtahash[current_line].include? current_station
      then puts "got it"
      else puts "fish"
    end
  else puts "no line"
end


0 commentaires