尝试创建数组数组时得到 "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]]

如果不知道 linesshared_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]]