额外阵列来自哪里?

时间:2016-09-12 12:51:27

标签: arrays ruby data-structures hash

这个问题是this answer的延续。

下面我试图用真实的数据结构重现答案,但由于某种原因我得到了一个额外的数组,并且交换了元素。

问题

两个输出应该是相同的,所以任何人都可以看到我做错了吗?

这是正确的:

require 'pp'

a = {"A"=>1, "B"=>1, "C"=>1}
b = {"A"=>1, "B"=>1, "D"=>1, "E"=>1}
c = {"D"=>1, "E"=>1, "F"=>1}

keys = Hash.new { |hash, key| hash[key] = [] }
a.each_key { |k| keys[k] << :a }
b.each_key { |k| keys[k] << :b }
c.each_key { |k| keys[k] << :c }
pp keys

给出了

{"A"=>[:a, :b],
 "B"=>[:a, :b],
 "C"=>[:a],
 "D"=>[:b, :c],
 "E"=>[:b, :c],
 "F"=>[:c]}

这是真正的数据结构,

groups = {
  "a" => {"A"=>1, "B"=>1, "C"=>1},
  "b" => {"A"=>1, "B"=>1, "D"=>1, "E"=>1},
  "c" => {"D"=>1, "E"=>1, "F"=>1}
}

keys2 = Hash.new { |hash, key| hash[key] = [] }
groups.each { |k,v| keys2[k] << v.keys }
pp keys2

,它给出了错误的输出

{"a"=>[["A", "B", "C"]], "b"=>[["A", "B", "D", "E"]], "c"=>[["D", "E", "F"]]}

2 个答案:

答案 0 :(得分:1)

  

额外阵列来自哪里?

下面。你自己推动它。

keys2[k] << v.keys

此外,这部分与您在第一部分中所做的不同。如果您要进行比较,请做正确的事。尽量减少差异。如果你做同样的事情(.each_key等),结构将是相同的。

答案 1 :(得分:1)

由于你的最内层结构没有改变,each_key部分应该几乎相同,即:

a.each_key { |k| keys[k] << :a }

但是a现在引用了一个嵌套的哈希值,:a引用了它的名称:

hash.each_key { |k| keys2[k] << name }

namehash引用group中的键和值:

groups = {
  "a" => {"A"=>1, "B"=>1, "C"=>1},
# ^^^    ^^^^^^^^^^^^^^^^^^^^^^^^
# name            hash

(请注意,您可以选择任何变量名称,namehash只是示例。)

全部放在一起:

require 'pp'

keys2 = Hash.new { |hash, key| hash[key] = [] }

groups.each do |name, hash|
  hash.each_key { |k| keys2[k] << name }
end

pp keys2

输出:

{"A"=>["a", "b"],
 "B"=>["a", "b"],
 "C"=>["a"],
 "D"=>["b", "c"],
 "E"=>["b", "c"],
 "F"=>["c"]}