获取按各自键排序的哈希值的最佳方法是什么? (红宝石)

时间:2010-04-24 16:59:48

标签: ruby sorting hash

以下是我正在做的事情:

test = {
  'd' => 20,
  'b' => 40,
  'c' => 30,
  'a' => 50,
  'e' => 10
}

f = []
test.to_a.sort.each do |e|
  f << e[1]
end
puts f.join(' ')

输出:

50 40 30 20 10

有更高效/简洁/更好的方法吗?在有人这样说之前,不,我不能使用数组。 :P

编辑抱歉,发错了代码。

3 个答案:

答案 0 :(得分:4)

在标题中,您提到要获取按其各自键排序的数组值。但在您的示例中,您实际上只是对值进行排序,而不管键。

如果这是你想要的,只需使用:

test.values.sort

但是如果你想根据键对值进行排序,请使用:

test.keys.sort.collect {|k| test[k]}

答案 1 :(得分:2)

test.values.sort.join(' ')

答案 2 :(得分:0)

test.sort_by(&:first).map(&:last).join(' ')

不幸的是,Ruby没有用于表示Hash条目(键值对)的类,而只是使用了一个双元素数组。如果Ruby 有一个专门的键值对类,那么这将不那么透明:

test.sort_by(&:key).map(&:value).join(' ')

当然,Enumerable#sort_by返回Array的事实也是非常不幸的。如果它返回SortedMap或类似的东西,它会更好:

test.sort_by(&:key).values.join(' ')