2016-08-09 3 views
1

私は、キーが名前で、値が電話番号(両方の文字列)である連絡先リストに対してハッシュを作成しました。ユーザーは操作を要求されます。私はハッシュをループする際の入力キーのいずれかと一致しない場合、ユーザーに通知しますelse文を入れたいif/else文によるハッシュ(Ruby)

print "Search Name: " 
name_search = gets.chomp 

contact_book.each { |name, number| puts "The name entered corresponds to the following phone number: #{number}\n" if name.upcase == name_search.upcase } 

、しかしだった:ここにあなたが、ユーザーのフルネームを検索するものです道を見つけられない。

+0

'contact_book.each {| name、number | name.upcase == name_search.upcase? puts "入力した名前は次の電話番号に対応します:#{number} \ n":puts "Do else"} ' –

+0

'contact_book.each {| name、number | if name.upcase == name_search.upcase; puts "入力された名前は、次の電話番号に対応します。#{number} \ n"; else; "Do else"} '' –

+0

なぜあなたは条件式の '=='の両側をアップケースしているのだろうか? –

答えて

2

あなたは、アレイは、これはあなたが多分同じ名前を持つ複数のエントリを持っている可能性があるという事実を強調していることを注意

matched_names = contact_book.select { |name, number| name.upcase == name_search.upcase } 
if matched_names.any? 
    puts "The name entered corresponds to the following phone number: #{matched_names.first.last}\n" 
else 
    puts "The name entered has no matches\" 
end 

を返さEnumerable#selectを使用して管理することができます。あなたはこのようなキーを検索することができ、ハッシュ内

+0

驚くばかりです。それは完璧に働いた - ありがとう@Ursus。 「連絡先を追加」オプションもあります。名前に繰り返しがないことを確認するためにこれを試してみます。 –

+2

さらに、['find'はブロック引数をとる](http://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-find)、ブロックが成功した最初の項目を返します。あなたが他の試合を気にしなければ、これは通常もっと効率的です。それはちょうど最初を見つけ、止まる。 – tadman

1

# convert all keys to upcase 
contact_book_lookup = {} 
hash.each_with_object(contact_book_lookup){ |(k, v), tmp_h| tmp_h[k.upcase] = v } 

search_key = name_search.upcase 
if contact_book_lookup.has_key? search_key 
    puts "The name entered corresponds to the following phone number: #{contact_book_lookup[search_key]}\n" 
else 
    puts "The name entered has no matches\" 
end 
0

他の回答は、彼らが動作するように見えるが、あなたが達成しようとしている何のために非常に冗長に見えます。私はそれがスタイルの好みだけだと思いますが、効率のために:もし私がハッシュがキーを持っているかどうかを知りたいのであれば、このように1行でやります。

phone_num = contact_book[ name_key ] 
puts (phone_num) ? "#{name_key}'s phone number is #{phone_num}" : "#{name_key} not found" 

私は毎回すべてのケースを再処理しようとしている人に気付きます。効率を上げるために、NxMではなく名前の保存に通常1回これを行います。