尝试创建数组数组时得到 "NoSuchMethodError"
Getting a "NoSuchMethodError" when trying to create an array of arrays
我正在使用 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
但我在 "data_cols[index][data_cols[index] ? data_cols[index].size : 0] = part" 行收到 "NoMethodError: undefined method `[]=' for nil:NilClass" 错误。我想要做的是对于每个部分数组,将 "parts" 中的每个项目推到它自己的数组中,对应于部分中该元素的索引。因此,例如,如果循环的第一次迭代的部分等于
[1, 5, 8, 12]
我会有一个 data_cols 数组,看起来像
[[1], [5], [8], [12]]
如果循环的下一次迭代有一个看起来像
的零件数组
[19, 20, 21, 22]
然后 data_cols 数组将更改为
[[1, 19], [5, 20], [8, 21], [12, 22]]
如果不知道 lines
和 shared_space_indexes
是什么样子就很难测试。
2 列 → 一个矩阵
zip
对于问题的第二部分,您可以使用:
[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
,两个数组的大小必须相同。
3 列 → 矩阵
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]]
我正在使用 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
但我在 "data_cols[index][data_cols[index] ? data_cols[index].size : 0] = part" 行收到 "NoMethodError: undefined method `[]=' for nil:NilClass" 错误。我想要做的是对于每个部分数组,将 "parts" 中的每个项目推到它自己的数组中,对应于部分中该元素的索引。因此,例如,如果循环的第一次迭代的部分等于
[1, 5, 8, 12]
我会有一个 data_cols 数组,看起来像
[[1], [5], [8], [12]]
如果循环的下一次迭代有一个看起来像
的零件数组[19, 20, 21, 22]
然后 data_cols 数组将更改为
[[1, 19], [5, 20], [8, 21], [12, 22]]
如果不知道 lines
和 shared_space_indexes
是什么样子就很难测试。
2 列 → 一个矩阵
zip
对于问题的第二部分,您可以使用:
[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
,两个数组的大小必须相同。
3 列 → 矩阵
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]]