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

时间:2019-03-20 20:06:16

标签: ruby sorting hash

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

“系统会向您提供包含某些语言的词典/哈希/对象,并以给定的语言显示您的测试结果。以结果的降序返回测试成绩至少为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新手-抱歉!)任何建议将不胜感激!

3 个答案:

答案 0 :(得分: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 :(得分: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具有可选参数。

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