Menu
CoddyTech

为 Hash.new 设置默认值

本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 33 课,共 56 课。

默认情况下,在哈希中查找不存在的键会返回 nil:

scores = {}
puts scores["Alice"]   # nil

Hash.new(default) 会改变这一点。每个缺失的键都会返回你传入的值:

scores = Hash.new(0)
puts scores["Alice"]   # 0

这是编写计数器最简洁的方式。递增之前,你不需要检查 if scores[name].nil?:

counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
  counts[letter] += 1
end
puts counts.inspect   # {"a"=>3, "b"=>1, "c"=>1}

重要:Hash.new(0) 会将默认值设为 0,但读取键时不会存储该键。赋值之前,哈希表会保持为空。因此,一旦你写下 counts[letter] += 1,键就会以新值添加。

challenge icon

挑战

简单

读取一个以逗号分隔的 category:amount 条目列表(例如 food:12,gas:30,food:8,books:25,gas:15)。使用 Hash.new(0) 创建一个按类别统计总额的哈希,然后只打印总额至少为 20 的类别,每行一个,并按总额降序排列:

<category>: <total>

对于上面的示例输入,输出为:

gas: 45
books: 25
food: 20

如果没有类别达到 20,则不打印任何内容。

亲手试试

entries = gets.chomp.split(",")

# TODO:totals = Hash.new(0);按类别累加 amount;
#       然后按 total 降序排序,输出 total >= 20 的类别
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Ruby 在线编译器