Ruby:用空格分隔的 2 个单词哈希键



我的程序中缺少什么方法可以使 2 个单词的州像新泽西州和南卡罗来纳州等一样工作。我知道通过在单词之间放置下划线会更容易,但用户还需要在他们的输入中包含下划线,这不是那么酷。我真的很感激任何帮助。谢谢!

us_capitals = { 
 "Alabama"=>"Montgomery", 
 "Alaska" => "Juneau", 
 "Arizona" => "Phoenix", 
 "Arkansas" => "Little Rock", 
 "California" => "Sacramento", 
 "Colorado" => "Denver", 
 "Connecticut" => "Hartford", 
 "Delaware" => "Dover", 
 "Florida" => "Tallahassee", 
 "Georgia" => "Atlanta", 
 "Hawaii" => "Honolulu", 
 "Idaho" => "Boise", 
 "Illinois" => "Springfield", 
 "Indiana" => "Indianapolis", 
 "Iowa" => "Des Moines", 
 "Kansas" => "Topeka", 
 "Kentucky" => "Frankfort",  
 "Louisiana" => "Baton Rouge", 
 "Maine" => "Augusta", 
 "Maryland" => "Annapolis", 
 "Massachusetts" => "Boston", 
 "Michigan" => "Lansing", 
 "Minnesota" => "Saint Paul",
 "Mississippi" => "Jackson", 
 "Missouri" => "Jefferson", 
 "Montana" => "Helena", 
 "Nebraska" => "Lincoln", 
 "Nevada" => "Carson City", 
 "New Hampshire" => "Concord", 
 "New Jersey" => "Trenton", 
 "New Mexico" => "Santa Fe", 
 "New York" => "Albany", 
 "North Carolina" => "Raleigh", 
 "North Dakota" => "Bismarck", 
 "Ohio" => "Columbus", 
 "Oklahoma" => "Oklahoma City", 
 "Oregon" => "Salem", 
 "Pennsylvania" => "Harrisburg", 
 "Rhode Island" => "Providence", 
 "South Carolina" => "Columbia", 
 "South Dakota" => "Pierre", 
 "Tennessee" => "Nashville", 
 "Texas" => "Austin", 
 "Utah" => "Salt Lake City", 
 "Vermont" => "Montpelier", 
 "Virginia" => "Richmond", 
 "Washington" => "Olympia",
 "West Virginia" => "Charleston", 
 "Wisconsin" => "Madison", 
 "Wyoming" => "Cheyenne"
}
loop do
  puts "Enter a state to lookup it's capital:"
  state = gets.chomp.capitalize
  puts us_capitals[state]
end

大写仅格式化字符串中的第一个字母,因此它不适用于包含多个单词的字符串。您可以尝试按空格拆分字符串,将每个单词大写,然后将其重新连接:

state = gets.chomp.split(' ').map(&:capitalize).join(' ')

示范

如果你使用的是Rails,你可以只使用titleize

gets.chomp.titleize

假设gets返回"west virginIan" 。然后

r = /[[:alpha:]]+/
state = gets.chomp.squeeze(' ').gsub(r) { |s| s.capitalize }
  #=> "west    virginIan".chomp.squeeze(' ').gsub(r) { |s| s.capitalize }
  #=> "west    virginIa".squeeze(' ').gsub(r) { |s| s.capitalize }
  #=> "west virginia".gsub(r) { |s| s.capitalize }
  #=> "West Virginia"
us_capitals[state]
  #=> "Charleston"

如果gets返回"West Virgin1a",我们得到

state = gets.chomp.squeeze(' ').gsub(r) { |s| s.capitalize }
  #=> "West Virgin1a"
us_capitals[state]
  #=> nil

回想一下,String#capitalize 将字符串的第一个字母转换为大写字母(如果是字母),但它也会将字符串中的所有其他字母转换为小写。

似乎最简单的解决方案是将哈希键设置为小写,然后downcase用户输入。

us_capitals = {
  # ...
  "nebraska" => "Lincoln", 
  "nevada" => "Carson City", 
  "new hampshire" => "Concord", 
  "new jersey" => "Trenton", 
  # ...
}
loop do
  puts "Enter a state to lookup it's capital:"
  state = gets.chomp.downcase
  puts us_capitals[state]
end

是否可以添加辅助方法来转换用户输入?

#state = "new jersey"
state.gsub!(/b[a-z]/, &:capitalize)
#state = "New Jersey"
  • 感谢约旦,在评论中

最新更新