将项目添加到哈希意外?

Posted

技术标签:

【中文标题】将项目添加到哈希意外?【英文标题】:Add item to hash went unexpectedly? 【发布时间】: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 及其值被插入键 23 之间。有什么解释吗?

【问题讨论】:

您使用的是哪个 ruby​​ 版本? 我真的不会这样做。某些版本的 Ruby 确实有一个保留顺序的 Hash 实现,但使用哈希作为有序集合总是很尴尬。通常有一种更好的方法可以通过对哈希进行排序来完成您想要完成的任何事情。 强制对哈希排序的最佳策略是获取键,使用keys,按您想要的顺序排列该数组,然后使用values_at 检索相同的关联值键的顺序。无论 Ruby 的版本如何,它都有效,并且该技术可用于其他语言。 【参考方案1】:

您可能正在使用 Ruby

【讨论】:

同意,但为什么会在 1.8 中发生呢? @user2393426 因为在 1.9 之前的 Ruby 哈希中不保证哈希排序。来自the docs for 1.8.7:“通过键或值遍历散列的顺序可能看起来是任意的,并且通常不会按照插入顺序。” 1.9.1: "哈希按照插入相应键的顺序枚举它们的值。"

以上是关于将项目添加到哈希意外?的主要内容,如果未能解决你的问题,请参考以下文章

哈希表打印出默认值,但将项目添加到地址边界错误时

如何在声明时将项目添加到哈希表? [复制]

XCode意外地将我的项目添加到文件夹中

缩小并将哈希添加到 css 文件 webpack

SyntaxError:无效或意外的令牌@import

redis