【问题标题】: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]}

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

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

【问题讨论】:

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

标签: ruby arrays hashtable


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2013-03-22
    • 2016-05-19
    • 2013-11-01
    相关资源
    最近更新 更多