【问题标题】:how to sort a hash with both keys and values如何使用键和值对哈希进行排序
【发布时间】:2014-10-07 07:11:34
【问题描述】:

考虑一个哈希

my_hash = {"drsn"=>["on", "tw", "th"], "mhsh"=>["tw", "th", "fo"], "achu"=>["th", "fo", "fi"]}

我可以通过

对哈希进行排序
Hash[my_hash.sort]

这会导致像这样的排序哈希

{"achu"=>["th", "fo", "fi"], "drsn"=>["on", "tw", "th"], "mhsh"=>["tw", "th", "fo"]}

但是谁能告诉我如何对 values 以及 key 进行排序?

喜欢

{"achu"=>["fi", "fo", "th"], "drsn"=>["on", "th", "tw"], "mhsh"=>["fo", "th", "tw"]}

我正在使用 ruby​​ 2.0.0

我也试过sort_by 喜欢

Hash[my_hash.sort_by {|k,v| v.sort}]

但是得到了

{"achu"=>["th", "fo", "fi"], "mhsh"=>["tw", "th", "fo"], "drsn"=>["on", "tw", "th"]}

【问题讨论】:

  • 您的示例值具有误导性。
  • @Stefan 你能告诉我你发现困难的地方吗?我会改变我的问题
  • ["three", "four", "five"] 未排序,["five", "four", "three"] 已排序,看起来很奇怪。
  • 你检查过 ["three", "four", "five"].sort 给你的回报了吗?据我所知,它按字母顺序对数组中的值进行排序。这就是我想要的。
  • @h.APP.y Stefan 是说表达数字的词(例如“三”、“四”……)暗示按数字排序,这会在你想要的时候产生误导根据不同的顺序(字典顺序)对单词进行排序。你用了不好的词作为例子。

标签: ruby sorting hash ruby-2.0


【解决方案1】:

您不能通过对哈希的顶级调用来做到这一点。您需要在哈希键排序之前或之后一次对单个子数​​组进行排序。

这会对哈希进行排序,然后,对于每个键/值,对值进行排序:

Hash[my_hash.sort.map { |a,b| [a, b.sort] }]

【讨论】:

  • 谢谢@meagar。你能解释一下为什么 Hash[my_hash.sort_by {|k,v| v.sort}] 没有用数组排序?
  • 因为您正在对子数组进行排序,但没有将它们存储在任何地方。 sort_by 不会对您传递的值做任何事情,除了 sort by 它们。原始值保留在my_hash 中。我的版本用排序后的版本覆盖它们。
【解决方案2】:

您的措辞具有误导性。你正在尝试做两件不同的事情。按键(如果键是平局的情况下的值)对哈希进行排序是通过以下方式完成的:

Hash[my_hash.sort]

对每个值进行排序是通过以下方式完成的:

my_hash.each{|_, v| v.sort!}

这里sort!用来修改值,是数组。

【讨论】:

  • 你能给出一些解释和答案吗?它真的帮助我像新手一样。
猜你喜欢
  • 2012-05-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2011-08-12
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多