【发布时间】:2012-10-31 11:43:57
【问题描述】:
假设我有一个 key => 数字值的排序哈希,如下所示:
h = { "sebastian" => 0.04, "joshua" => 0.1, "alli" => 0.2, "oliver" = >0.2,
...
"wendi" => 1.9, "esther" => 2.1, "mauricio" => 2.6, "fred" => 3.9 }
在此哈希中,最小值为 0.04,最大值为 3.9。 (在其他哈希中,这可能完全不同,例如 3..90、1.5..900 等)
现在我有一个有序数组,如下所示:
a = ["lowest", "lower", "low", "normal", "high", "higher", "highest"]
给定哈希中的任何一个值,比如 1.9,我如何确定该值落在数组中描述的范围内的哪个位置?
(请原谅这里的 Ruby 和数学新手!)
谢谢!
更新 1:
对不清楚的问题表示歉意。仍在试图弄清楚如何描述这一点。
这是一个概念性示例,说明我目前如何解决我的问题,可能会有所帮助。
scores = { "sebastian" => 0.04, "joshua" => 0.1, "alli" => 0.2, "oliver" => 0.2,
"wendi" => 1.9, "esther" => 2.1, "mauricio" => 2.6, "fred" => 3.9 }
adjectives = ["lowest", "lower", "low", "average", "high", "higher", "higher"]
scores.each_pair do |student, score|
adj_idx = case score
when 3.35..4 then 6
when 2.8..3.34 then 5
when 2.25..2.7 then 4
when 1.7..2.24 then 3
when 1.15..1.6 then 2
when 0.6..1.16 then 1
else 0
end
puts "#{student} score was in the #{adjectives[adj_idx]}."
end
所以我的问题是: 给定一系列可能不同的学生分数(例如,分数可能是 GPA 0.0..4.0,或考试分数 0..110),以及一系列“形容词” ” 也可能会有所不同(例如,“更高”和“更低”可能会被删除),有没有一种方法可以将分数映射到形容词,而无需像我上面所做的那样“手动”构建每个案例。
再次感谢!
更新 2:
感谢您的所有帮助。我想我已经得到了以下解决方案。关键公式是这样的:
adj_idx = ( (adjectives.size - 1) * ( (score - min_score).to_f / (max_score - min_score).to_f ) ).round
min_score = scores.values.min
max_score = scores.values.max
scores.each_pair do |student, score|
adj_idx = ( (adjectives.size - 1) * ((score - min_score).to_f / (max_score - min_score).to_f) ).round
puts "#{student} score was in the #{adjectives[adj_idx]} range."
end
【问题讨论】:
-
你能解释一下“它落在哪里”的意思吗?你的意思是如果它被插入到数组中,它的索引是什么?对不起,我没有关注....
-
确定。好的,我的意思是,我如何计算 1.9 在 0.04 到 3.9 的数字范围内是否是“最低”、“较低”、“低”等。如果 1. 数字范围不同,例如 1.5..300 AND 2. 标签数组不同,例如 a = [-5, -4, -3, - 2、-1、0、1、2、3、4、5]。希望这是有道理的。
-
您如何定义“最低”、“较低”、……“最高”是什么?甚至分道扬镳?如果它在两个之间,你会舍入还是占据地板或天花板?
-
@AndrewMarshall,我已经更新了我的问题。希望现在更清楚了。谢谢。
-
“有没有一种方法可以将分数映射到形容词,而无需像我上面所做的那样“手动”构建每个案例“是的,描述您用于手动构建阈值的算法,然后用代码实现它.请注意,没有一种正确的方法可以做到这一点 - 您是否希望将值范围以线性、几何或指数方式划分?