Ruby:哈希不是可以排序的

时间:2017-01-24 23:55:15

标签: ruby

我的哈希脾气暴躁。 :(

我想对它进行排序,但它不想要,我找不到它的原因:

x = [{2 => "two", 1 => "one"}, {4 => "four", 3 => "three"}]

x.each do |y|
    if y.is_a?(Hash) then y = y.sort end
end

(哈希必须以.each方法排序)

最后,不要使用这种结构:

[{2=>"two", 1=>"one"}, {4=>"four", 3=>"three"}]

我想要这个结构:

[[[1, "one"], [2, "two"]], [[3, "three"], [4, "four"]]]

在阅读了一些类似的问题之后,我尝试将Hash替换为::Hash,或者在排序之前将哈希值转换为数组,但它仍然不起作用...

如何对哈希进行排序?

3 个答案:

答案 0 :(得分:2)

arr = [{2=>"two", 1=>"one"}, {4=>"four", 3=> "three"}]

arr.map { |h| h.sort_by(&:first) }
  #=> [[[1, "one"], [2, "two"]], [[3, "three"], [4, "four"]]]

答案 1 :(得分:1)

你的循环脾气暴躁而不是你的哈希:)

您正在对哈希进行排序,但您的循环不会更新数组。

这是一个简化的例子

array.each do |y|
  y = y.sort  
end

上面将已排序的哈希重新分配给局部变量y,因此不会更新array中的值。对block参数的赋值不会写回您要枚举的数组。

使用map代替

array = array.map do |y|
  y.sort  
end

答案 2 :(得分:0)

Cary Swoveland 的答案是短暂的

这里我写了一个更长的版本

x = [{ 2 => "two", 1 => "one"}, {4 => "four", 3 => "three"}]
y = x.map{ |el| el.to_a.sort }

所以变量应该像

 x => [{ 2 => "two", 1 => "one"}, {4 => "four", 3 => "three"}]
 y => [[[1, "one"], [2, "two"]], [[3, "three"], [4, "four"]]]