对作为哈希值的数组进行排序

时间:2016-12-29 03:45:32

标签: arrays ruby sorting hash

我有一个散列,其中键是整数,值是字符串数组。我需要按字母顺序对数组中的项进行排序,并将排序后的数组作为新的哈希值返回。

我觉得像hash.map{ |k,v| v.sort }之类的东西会起作用,但是,没有。为了更明确一点,我需要转向:

hash = { 0 => ["c", "d", "b", "a"], 1 => ["e", "q", "x", "m"] }

成:

hash = { 0 => ["a", "b", "c", "d"], 1 => ["e", "m", "q", "x"] }

3 个答案:

答案 0 :(得分:4)

这是一种方式:

 hash.each_value { |v| v.sort! }
 #=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]} 

或更简洁:

hash.each_value(&:sort!)

但是,如果您希望保留原始哈希,请执行以下操作:

hash.map { |k,v| [k,v.sort] }.to_h
#=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]} 

答案 1 :(得分:2)

试试这个,

hash.each { |k,v| v.sort! }

这会对数组进行就地排序。

答案 2 :(得分:0)

这不会改变原始哈希值。

hash.merge(hash) { |*,n| n.sort }
  #=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]}

如果要修改原始哈希,请将merge!(又名update)替换为merge

这使用Hash#mergeHash#merge!的形式,它们使用一个块来确定合并的两个哈希中存在的键的值,这里是原始哈希的所有键。有关详细信息,请参阅文档。