Ruby - 按值按降序排序哈希值

问题描述 投票:0回答:3

我正在尝试解决以下问题:

“您将获得包含某些语言的字典/哈希/对象以及给定语言的测试结果。返回测试分数至少为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新手也 - 抱歉!)任何建议将不胜感激!

ruby sorting hash
3个回答
4
投票

你有点混合排序和过滤阶段。我的解决方案

  1. 使用value >= 60过滤结果
  2. 排序值(降序,-v
  3. 提取每个数组的第一个元素(语言名称) def my_languages(results) results.select { |k, v| v >= 60 }.sort_by { |(k,v)| -v }.map(&:first) end

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_bymin_bymaxmin被允许有一个可选参数。


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)
© www.soinside.com 2019 - 2024. All rights reserved.