我正在制作一个计算成绩的程序,并使用值的哈希来帮助完成字母分配。我的哈希看起来像这样
LETTERS = {
"A+" => 98, "A" => 95, "A-" => 92,
"B+" => 88, "B" => 85, "B-" => 82,
"C+" => 78, "C" => 75, "C-" => 72,
"D+" => 68, "D" => 65, "D-" => 62,
"F+" => 55, "F" => 40, "F-" => 25,
}
我的问题是,即使它不是散列中的显式值,我怎么能将71分配给等级?
答案 0 :(得分:4)
首先,在ruby中我们称之为哈希 - 而不是字典。你可以做你想做的事:
def grade(points)
LETTERS.find {|_, v| v <= points}.first
end
注意:Find方法取决于散列的顺序 - 如果散列不按值排序(desc),则上述函数将无法正常工作。另外 - 你没有说如果点数是20(低于任何阈值)会发生什么。目前它将抛出NoMethodError
答案 1 :(得分:1)
我没有在这里看到使用哈希的原因。实际上,OP散列中的键和值是相反的,没用。
[
[98, "A+"],
[95, "A"],
[92, "A-"],
[88, "B+"],
[85, "B"],
[82, "B-"],
[78, "C+"],
[75, "C"],
[72, "C-"],
[68, "D+"],
[65, "D"],
[62, "D-"],
[77, "F+"],
[40, "F"],
[25, "F-"],
]
.bsearch{|x, _| x <= 89}.to_a.last
# => "B+"
与BroiSatse的回答几乎相同。
答案 2 :(得分:0)
不是一个确切的答案,但是: 您可以改为使用根据值
返回等级的函数def get_grade(points)
return "A+" if points >= 98
return "A" if points < 98 and points >= 95
... # etc
end
这样您就不必为每个值分配一个等级。
或者,您可以为每个成绩指定一个点数组
答案 3 :(得分:0)
另一种可能性是使用case
将逻辑编码为方法。我正在添加这个选项,因为@ blueygh2的回答让我眼前一亮:)
def grade(score)
case score
when 98..100
"A+"
when 95...98
"A"
when 92...95
"A-"
end
# and so forth
end
使用非包含范围(带有三个点)可以使用小数分数,但这可能不是必需的。