【发布时间】:2018-10-16 11:48:22
【问题描述】:
我有这个输入:
Us,1,1,F
Us,1,2,O
Us,2,1,N
Pa,1,1,S
Pa,1,3, D
Pa,1,5,H
Pa,4,7,K
我正在尝试获取数组的哈希值(反过来,它是数组的哈希值)。我想得到这个哈希:
b = {
"Us" => [
{"1" => [["1", "F"], ["2", "O"]]},
{"2" => [["1", "N"]]}
],
"Pa" => [
{"1" => [["1", "S"], ["3", "D"], ["5", "H"]]},
{"4" => [["7", "K"]]}
]
}
这是我的代码:
a = Hash.new{|hsh, key| hsh[key] = []}
b = Hash.new{|hsh, key| hsh[key] = []}
File.readlines('file.txt').each do |line|
r = line.split(",")
a[r[0] + "°" + r[1]].push [r[2], r[3].strip] # I load hash "a" here
end
a.map{|k, v|
m=k.split("°")
b[m[0]].push [m[1]=> v] # I load hash "b" here
}
hash的key是Column1和Column2中值的唯一组合(Col1°Col2),value是Col2(二级hash的key)、Col3和Col4之间的关系(这两个为内部数组的元素)。
我几乎得到了结果,但是有一个额外的嵌套。我得到了这个结果:
b = {
"Us"=>[
[{"1"=>[["1", "F"], ["2", "O"]]}],
[{"2"=>[["1", "N"]]}]
],
"Pa"=>[
[{"1"=>[["1", "S"], ["3", "D"], ["5", "H"]]}],
[{"4"=>[["7", "K"]]}]
]
}
请给我一些帮助。
更新
根据 Cary 的建议修改为更短的代码。
a = Hash.new{|hsh, key| hsh[key] = []}
b = Hash.new{|hsh, key| hsh[key] = []}
File.readlines('input').each do |line|
r = line.chomp.split(",")
a[[r[0], r[1]]].push [r[2], r[3]]
end
a.each{|k, v|
b[k[0]].concat [k[1] => v]
}
更新2
即使在 Cary 的帮助下,我也能够获得最终输出,我在下面展示了为什么我试图获取数组的哈希值以及在数组内部另一个数组的哈希值。
这是输出。就像组织一个显示章节(“Us”和“Pa”)的书籍索引,然后显示每个章节的章节(“Us”为 1 和 2,“Pa”为 1 和 4)。然后对于每章显示每篇文章及其相关描述,示例文章“3”具有描述“D”,因此“D”打印在“3”旁边,文章“3”属于属于章节的“1”章“帕”。
Us
......1
..............1.......F
..............2.......O
......2
..............1.......N
Pa
......1
..............1.......S
..............3.......D
..............5.......H
......4
..............7.......K
感谢您的大力帮助!
【问题讨论】: