Ruby - 按值按降序排序哈希值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby - 按值按降序排序哈希值相关的知识,希望对你有一定的参考价值。
我正在尝试解决以下问题:
“您将获得包含某些语言的字典/哈希/对象以及给定语言的测试结果。返回测试分数至少为60的语言列表,按结果的降序排列。
示例:{“Java”=> 10,“Ruby”=> 80,“Python”=> 65} - > [“Ruby”,“Python”]
{“Hindi”=> 60,“Dutch”=> 93,“Greek”=> 71} - > [“Dutch”,“Greek”,“No”]
{“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新手也 - 抱歉!)任何建议将不胜感激!
答案
你有点混合排序和过滤阶段。我的解决方案
- 使用
value >= 60
过滤结果 - 排序值(降序,
-v
) - 提取每个数组的第一个元素(语言名称)
def my_languages(results) results.select { |k, v| v >= 60 }.sort_by { |(k,v)| -v }.map(&:first) end
另一答案
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
被允许有一个可选参数。
另一答案
为了使它更快,我会在映射时检查最小值:
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)
以上是关于Ruby - 按值按降序排序哈希值的主要内容,如果未能解决你的问题,请参考以下文章
使用 plotly-express 按值按降序排列条形图中的条形