Ruby赋值哈希

时间:2014-03-09 20:37:17

标签: ruby hash key

我正在制作一个计算成绩的程序,并使用值的哈希来帮助完成字母分配。我的哈希看起来像这样

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分配给等级?

4 个答案:

答案 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

使用非包含范围(带有三个点)可以使用小数分数,但这可能不是必需的。