首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails .基于Sub散列值的散列排序散列

Rails .基于Sub散列值的散列排序散列
EN

Stack Overflow用户
提问于 2014-11-27 14:53:00
回答 3查看 720关注 0票数 1

我有以下散列:

代码语言:javascript
复制
h = { "people"=>
        { "joe"   => { "score" => 3, "favorite_food" => "pizza"}, 
          "marry" => { "score" => 89, "favorite_food" => "ice_cream" }
         }
     }

如何根据分数对这个散列进行排序(并保持排序)?

ie:结果是:

代码语言:javascript
复制
    { "people"=>
        { 
          "marry" => { "score" => 89, "favorite_food" => "ice_cream" }
          "joe"   => { "score" => 3, "favorite_food" => "pizza"}, 
         }
     }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-27 15:05:10

如果您是指哈希值的计算顺序,则必须重构子哈希:

代码语言:javascript
复制
h[ 'people' ].replace(h[ 'people' ].to_a.sort do |x, y|
   y[1][ 'score' ] <=> x[1][ 'score' ]
end.to_h)

对于较早版本的ruby,请使用Hash构造函数:

代码语言:javascript
复制
h[ 'people' ].replace( Hash[h[ 'people' ].to_a.sort do |x, y|
   y[1][ 'score' ] <=> x[1][ 'score' ]
end] )

附加注意事项:有序散列出现在rubyVersion2.1中(据我所知)。

票数 1
EN

Stack Overflow用户

发布于 2014-11-27 15:39:57

如果您希望代码更清晰(更长),则可以将散列哈希(让我们称之为h)转换为包含所有要排序但略有不同的元素的散列数组(让我们称之为a),然后对数组的元素执行排序--使用您喜欢的任何键:

代码语言:javascript
复制
a = []
p["people"].each do |p| 
  a << { :name => p, :score => p["score"], :food => p["food"] } 
end

sorted = a.sort_by { |e| e[:score] }
票数 1
EN

Stack Overflow用户

发布于 2014-11-27 23:03:19

因此,为了完成任务,下面是另一种排序方法:

代码语言:javascript
复制
h.deep_symbolize_keys!
h[:people].sort_by {|k,v| v[:score]}.reverse!

我不能对这件事的效率发表意见,但它有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27173430

复制
相关文章

相似问题

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