【发布时间】:2014-01-08 19:47:05
【问题描述】:
编辑:我的错!!!问题解决了(我在 ruby 1.8 上测试了这个,在 ruby 1.9 上按预期工作)
我有一个现有的散列,想对其进行排序,以便所有键都按数字顺序排列。
a = {4 => 5, 8 => 20, 3 => 2, 6 => 1, 7 => 10, 2 => 1 }
=> #Wanted Newhash = {2 => 1, 3 => 2, 4 => 5, 6 => 1, 7 => 10, 8 => 20 }
这是我所做的:
b = a.keys.sort => [2,3,4,6,7,8]
c ={}
for key in b
p key
c[key] = a[key]
p c
end
这是输出:
2
{2=>1}
3
{2=>1, 3=>2}
4
{2=>1, 3=>2, 4=>5}
6
{6=>1, 2=>1, 3=>2, 4=>5}
7
{6=>1, 7=>10, 2=>1, 3=>2, 4=>5}
8
{6=>1, 7=>10, 2=>1, 8=>20, 3=>2, 4=>5}
我不明白的是:
我在b 中排序的键是我想要的。我想如果我将它添加到一个新的散列中,它会被添加到散列的末尾,但这里不是这样。怎么会这样?键 6 及其值被添加到前面,键 7 被添加在之后,然后键 8 及其值被插入键 2 和 3 之间。有什么解释吗?
【问题讨论】:
-
您使用的是哪个 ruby 版本?
-
我真的不会这样做。某些版本的 Ruby 确实有一个保留顺序的 Hash 实现,但使用哈希作为有序集合总是很尴尬。通常有一种更好的方法可以通过对哈希进行排序来完成您想要完成的任何事情。
-
强制对哈希排序的最佳策略是获取键,使用
keys,按您想要的顺序排列该数组,然后使用values_at检索相同的关联值键的顺序。无论 Ruby 的版本如何,它都有效,并且该技术可用于其他语言。