首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby -按值将散列排序为降序

Ruby -按值将散列排序为降序
EN

Stack Overflow用户
提问于 2019-03-20 20:06:16
回答 3查看 340关注 0票数 0

我试图解决以下几个问题:

“您将得到一个字典/散列/对象,其中包含某些语言和给定语言的测试结果。按结果的降序,返回测试分数至少为60的语言列表。

例子:{"Java“=> 10,"Ruby”=> 80,"Python“=> 65} -> "Ruby",”=>“

{“印地语”=> 60,“荷兰语”=> 93,“希腊语”=> 71} ->“荷兰语”,“希腊语”,“印地语”

{"C++“=> 50,"ASM”=> 10,"Haskell“=> 20} -> []

我很难按结果按降序排序。这是我到目前为止所拥有的

代码语言:javascript
运行
复制
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新手(堆栈溢出新手也-对不起!)任何建议都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-20 20:12:02

你把分类和过滤阶段混在一起。我的解决方案

  1. value >= 60实现滤波结果
  2. 对值进行排序(降序,-v)
  3. 提取每个数组的第一个元素(语言名称) def my_languages(结果) results.select { end,v_x_v >= _( 60 ) }.sort_by {AC.26(k,v)\x -v }.map(&:first)结束
票数 4
EN

Stack Overflow用户

发布于 2019-03-20 20:23:42

代码语言:javascript
运行
复制
h = { "Java" => 10, "Ruby" => 80, "Python" => 65 }

h.select { |_,v| v >= 60 }.
  keys.
  sort_by { |k| -h[k] }
  #=> ["Ruby", "Python"] 

步骤如下。

代码语言:javascript
运行
复制
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],那么可以选择两种方法。

代码语言:javascript
运行
复制
h.select { |_,v| v >= 60 }.
  keys.
  sort_by { |k| h[k] }.
  reverse

代码语言:javascript
运行
复制
a = h.select { |_,v| v >= 60 }.
      keys
a.max_by(a.size) { |k| h[k] }

我怀疑大家是否会注意到这三者在表现上有任何显著差异。

自从Rubyv2.2以来,通过min_bymaxmin都被允许有一个可选的参数。

票数 1
EN

Stack Overflow用户

发布于 2019-03-21 15:31:36

为了使它更快,我将在映射时检查最小值:

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55269343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档