我为联系人列表创建了一个哈希(对于这个概念仍然相对较新),其中键是名称,值是电话号码(两个字符串)。要求用户采取行动;您可以在此处搜索用户的全名:
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 }
我想放一个else语句,当循环遍历哈希时输入与任何键不匹配时会通知用户,但是无法找到方法。
答案 0 :(得分:2)
您可以使用Enumerable#select并管理返回的数组
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
请注意,这突出表明您可能有多个具有相同名称的条目。
答案 1 :(得分: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
答案 2 :(得分:0)
其他答案看起来会起作用,但对于你想要完成的事情似乎相当冗长。我想这只是风格偏好,但是为了效率:如果我想看看散列是否有一个键,我会在一行中这样做。
phone_num = contact_book[ name_key ]
puts ( phone_num ) ? "#{name_key}'s phone number is #{phone_num}" : "#{name_key} not found"
我注意到有人试图每次都重写一切。为了提高效率,通常在存储名称时执行此操作一次,而不是在搜索名称时执行NxM次。