У меня есть следующие два хэша с массивами в качестве значений.
a = {
"Us" => [["1", ["1", "2"]], ["2", ["1"]]],
"Pa" => [["1", ["1", "3", "5"]], ["4", ["7"]]]
}
b = {
"Us" => [["1", ["F", "O"]], ["2", ["N"]]],
"Pa" => [["1", ["S", "D", "H"]], ["4", ["K"]]]
}
Я пытаюсь объединить хэши, чтобы получить финал, как это:
c = {
"Us" => [["1", ["1|F", "2|O"]], ["2", ["1|N"]]],
"Pa" => [["1", ["1|S", "3|D", "5|H"]], ["4", ["7|K"]]]
}
Я нашел следующий код с merge
и попытался применить его к моей проблеме, но получил ошибку:
a.merge(b) {|key, a_val, b_val| a_val.merge b_val }
# >> NoMethodError: undefined method `merge' for [["1", ["1", "2"]], ["2", ["1"]]]:Array
Я даже получил ошибку с a + b
:
a + b
# >> NoMethodError: undefined method `+' for #<Hash:0x0000060078e460>
<<<< ОБНОВЛЕНИЕ >>>>
Спасибо и Кэри, и Тэдману. Вне исходного вопроса я показываю входной файл, который у меня есть, и вывод, который я пытаюсь получить. Я показываю для того, чтобы вы поняли, почему
Я сгенерировал 2 хэша таким образом. В выходных данных я создаю блоки, в которых отцы - это уникальные значения столбца 1, ниже дочерних (уникальные значения в столбце 2, связанные со столбцом 1).
Столбец 3 - это дочерние элементы, принадлежащие значению в столбце col2, а столбец 4 - текстовое содержимое, связанное с столбцом col3.
Вероятно, хеш "c" легче с самого начала генерировать.
Это мой входной файл
Main,Stage1,Stage2,Description
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
Это вывод, который я почти получаю.
Main..Stage1..Stage2..Description
Us
......1
..............1.......F
..............2.......O
......2
..............1.......N
Pa
......1
..............1.......S
..............3.......D
..............5.......H
......4
..............7.......K
Тогда я смог создать этот код, но, как говорит Тадман, мне нужно изменить порядок, как я это делаю, чтобы упростить вещи, так как
Я использую 4 хэша. После того, как я создал хэш «a» и «b», я застрял, так как мне нужен был уникальный хеш для итерации и возможности печати в структуре вывода, показанной выше.
Мой код перед публикацией вопроса
X = Hash.new{|hsh,key| hsh[key] = [] }
Y = Hash.new{|hsh,key| hsh[key] = [] }
a = Hash.new{|hsh,key| hsh[key] = [] }
b = Hash.new{|hsh,key| hsh[key] = [] }
File.foreach('file.txt').with_index do
|line, line_num|
if line_num > 0
r = line.split(",")
X[r[0] + "°" + r[1]].push r[2]
Y[r[0] + "°" + r[1]].push r[3].strip
end
end
X.each{ |k,v|
lbs = k.split("°")
a[lbs[0]].push [ lbs[1], v] #Here I generate hash a
}
Y.each{ |k,v|
lbs = k.split("°")
b[lbs[0]].push [ lbs[1], v] #Here I generate hash b
}