在哈希的键数组中追加元素

Posted

技术标签:

【中文标题】在哈希的键数组中追加元素【英文标题】:Append element in hash's key-array 【发布时间】:2012-03-24 08:24:43 【问题描述】:

查看我的 Ruby 代码:

h=Hash.new([])
h[0]=:word1    
h[1]=h[1]<<:word2
h[2]=h[2]<<:word3
print "\nHash = "
print h

输出是:

Hash = 0=>:word1, 1=>[:word2, :word3], 2=>[:word2, :word3]

我希望有

Hash = 0=>:word1, 1=>[:word2], 2=>[:word3]

为什么要附加第二个哈希元素(数组)?

如何仅将第三个哈希的元素附加到新的数组元素?

【问题讨论】:

Modifying the default hash value 的可能重复项 我无法想出任何合理的方案,只要你想要的东西是有意义的。为什么你期望h[2]h[1] 具有相同的值。 糟糕,抱歉,我已经编辑了我的预期结果。不过我已经接受了答案。 @MichaelZ 好的,太好了;我将从我的答案中删除令人困惑的编辑。 【参考方案1】:

如果您将单个值作为参数提供给 Hash.new(例如 Hash.new( [] ),则 完全相同的对象 将用作每个缺失键的默认值。这就是您所拥有的,那就是你不想要什么。

您可以改为使用 Hash.new 的块形式,其中 每次 请求缺少的键时都会调用该块:

irb(main):001:0> h = Hash.new [] 
#=> 
irb(main):002:0> h[0] = :foo
#=> :foo
irb(main):003:0> h[1] << :bar
#=> [:bar]
irb(main):004:0> h
#=> 0=>:foo

但是,正如我们在上面看到的那样,get 值,但它不是 set 作为那个缺失键的值。如上所述,您需要硬设置该值。通常,您想要的是使该值作为该键的值神奇地栩栩如生:

irb(main):005:0> h = Hash.new |h,k| h[k] = [] 
#=> 
irb(main):006:0> h[0] = :foo
#=> :foo
irb(main):007:0> h[1] << :bar
#=> [:bar]
irb(main):008:0> h
#=> 0=>:foo, 1=>[:bar]

现在,当我们要求缺少键时,我们不仅可以取回全新的数组,而且这会自动使用数组填充我们的哈希,这样您就不需要做h[1] = h[1] &lt;&lt; :bar

【讨论】:

哇!谢谢!你让我大开眼界!【参考方案2】:

如果要使用数字索引作为哈希值,为什么不直接使用数组呢?

h = []
h<<:word1 
h<<:word2
h<<:word3
print h

为了达到你想要的输出:

h = []
h<<:word1 
h<<:word2
h<<[]
h[2]<<h[1]<<:word3
print h

【讨论】:

以上是关于在哈希的键数组中追加元素的主要内容,如果未能解决你的问题,请参考以下文章

向数组中追加一个新元素

追加到数组替换数组中的所有元素

js追加append是追加在最后一个,啥是追加在第一个

Python为啥向二维列表中追加元素后所有元素都变一样了

Javascript,追加节点添加整个数组而不是最后一个元素

在二维数组中追加/连接数组