我正在尝试解决以下问题:
“系统会向您提供包含某些语言的词典/哈希/对象,并以给定的语言显示您的测试结果。以结果的降序返回测试成绩至少为60的语言列表。
示例: {“ Java” => 10,“ Ruby” => 80,“ Python” => 65}-> [“ Ruby”,“ Python”]
{“印地语” => 60,“荷兰语” => 93,“希腊语” => 71}-> [“荷兰语”,“希腊语”,“印地语”]
{“ C ++” => 50,“ ASM” => 10,“ Haskell” => 20}-> []
我无法按结果按降序排序。这是我到目前为止所拥有的
def my_languages(results)
array = []
results.each { |a,b|
results.values.sort.reverse
if b.to_i >= 60
array << a
end
}
return array
end
这不是最优雅的解决方案,但是我是一个完整的Ruby新手(也是Stack Overflow新手-抱歉!)任何建议将不胜感激!
答案 0 :(得分:4)
您正在混合排序和过滤阶段。我的解决方案
value >= 60
过滤结果-v
)为每个数组(语言名称)提取第一个元素
def my_languages(results)
results.select { |k, v| v >= 60 }.sort_by { |(k,v)| -v }.map(&:first)
end
答案 1 :(得分:1)
h = { "Java" => 10, "Ruby" => 80, "Python" => 65 }
h.select { |_,v| v >= 60 }.
keys.
sort_by { |k| -h[k] }
#=> ["Ruby", "Python"]
步骤如下。
g = h.select { |_,v| v >= 60 }
#=> {"Ruby"=>80, "Python"=>65}
a = g.keys
#=> ["Ruby", "Python"]
a.sort_by { |k| -h[k] }
#=> ["Ruby", "Python"]
如果您不关心-h[k]
,请选择两个替代方法。
h.select { |_,v| v >= 60 }.
keys.
sort_by { |k| h[k] }.
reverse
和
a = h.select { |_,v| v >= 60 }.
keys
a.max_by(a.size) { |k| h[k] }
我怀疑这三者之间的表现是否存在显着差异。
自Ruby v2.2起,允许 Enumerable#max_by,min_by
,max
和min
具有可选参数。
答案 2 :(得分:0)
为了更快,我会在映射时检查最小值:
hash = {"Hindi" => 60, "Dutch" => 93, "Greek" => 71}
hash.sort.map { |arr| arr[0] if arr[1] >= 60 }.compact
# or imo cleaner
hash.sort.select { |a| a[1] >= 60 }.map(&:first)