我使用的是Ruby 2.4。我在创建数组数组时遇到了麻烦。我有这个
data_cols = [[], []]
lines.each do |line|
parts = [0, *shared_space_indexes, line.size].each_cons(2).map { |a, b| line[a...b].strip }
parts.each_with_index do |part, index|
data_cols[index][data_cols[index] ? data_cols[index].size : 0] = part
end
end
但是我得到了一个" NoMethodError:未定义的方法`[] ='为零:NilClass" " data_cols [index] [data_cols [index]? data_cols [index] .size:0] = part"线。我想要做的是为每个零件阵列,推动每个项目在"部分"在它自己的数组上对应于部分中该元素的索引。因此,例如,如果循环的第一次迭代具有等于
的部分[1, 5, 8, 12]
我会有一个看起来像
的data_cols数组[[1], [5], [8], [12]]
如果循环的下一次迭代有一个看起来像
的零件数组[19, 20, 21, 22]
然后将data_cols数组更改为
[[1, 19], [5, 20], [8, 21], [12, 22]]
答案 0 :(得分:0)
很难在不知道lines
和shared_space_indexes
的情况下进行测试。
对于问题的第二部分,您可以使用:
[1, 5, 8, 12].zip([19, 20, 21, 22])
#=> [[1, 19], [5, 20], [8, 21], [12, 22]]
[[1, 5, 8, 12],[19, 20, 21, 22]].transpose
#=> [[1, 19], [5, 20], [8, 21], [12, 22]]
使用transpose
,两个数组都需要具有相同的大小。
array1 = [1, 5, 8, 12]
array2 = [19, 20, 21, 22]
array3 = [99, 88, 77, 66]
p [array1, array2, array3].transpose
#=> [[1, 19, 99], [5, 20, 88], [8, 21, 77], [12, 22, 66]]
如果你有一个数组数组:
arrays = [
[1, 5, 8, 12],
[19, 20, 21, 22],
[99, 88, 77, 66]
]
p arrays.transpose
#=> [[1, 19, 99], [5, 20, 88], [8, 21, 77], [12, 22, 66]]
所以在你的情况下,我只是专注于创建一个长度相同的数组,并在最后使用transpose
。
如你所知,如果你有
data_cols = [[1, 19], [5, 20], [8, 21], [12, 22]]
arr = [99, 88, 77, 66]
data_cols.zip(arr)
会产生一个奇怪的半嵌套数组:
[[[1, 19], 99], [[5, 20], 88], [[8, 21], 77], [[12, 22], 66]]
您可以使用:
p data_cols.zip(arr).map(&:flatten)
#=> [[1, 19, 99], [5, 20, 88], [8, 21, 77], [12, 22, 66]]