右对齐数组内容

时间:2017-07-21 16:07:20

标签: arrays ruby

我需要为绘图和分析准备一些数据,并且可以使用一些建议来转换这些数据。

我有一个数组数组。每个子数组是一组收集的数据,最后一个元素代表所有数据的最新数据。早期元素代表历史数据。子阵列具有可变数量的历史。我想处理数组,以便当前数据(每个子数组中的最后一个元素)与右边界对齐。

例如:

[[2], [3, 5, 8, 9], [2, 10]]

应转换为或处理,如同:

[[nil, nil, nil, 2], [3, 5, 8, 9], [nil, nil, 2, 10]]

如果可能的话,我宁愿不改变原始数据,但是如果它有帮助就可以处理它(我会先将full_dup数组用于数据并处理副本)

2 个答案:

答案 0 :(得分:5)

candidate_matrix = [[2], [3, 5, 8, 9], [2, 10]]

row_size = candidate_matrix.map(&:size).max
candidate_matrix.map { |numbers| [nil] * (row_size - numbers.size) + numbers }
  # => [[nil, nil, nil, 2], [3, 5, 8, 9], [nil, nil, 2, 10]]

答案 1 :(得分:1)

<强>阵列#填充

正如本answer中所述,您可以使用Array#fill

m = arr.max_by(&:size).size
arr.map { |s| s.reverse.fill(nil, m..m-1).reverse }
 #=> [[nil, nil, nil, 2], [3, 5, 8, 9], [nil, nil, 2, 10]]

<强>阵列#插入件

或者使用更加语义的答案,您可以使用Array#insert

arr.map { |s| s.dup.insert(0, [nil] * (m - s.size)).flatten }
#=> [[nil, nil, nil, 2], [3, 5, 8, 9], [nil, nil, 2, 10]]

<强>内核#环

arr.map { |sub|
  sub = sub.dup
  loop {
    break if sub.size >= m
    sub.insert 0, nil
  }
  sub
}
#=> [[nil, nil, nil, 2], [3, 5, 8, 9], [nil, nil, 2, 10]]

你可以使用类似的whileuntil循环,我认为看起来更好但是你会面对成语警察的愤怒。另外,使用unshiftinsert需要dup这是不理想的。

我在这里使用insert 0, nil而不仅仅是unshift nil的原因是因为你想要左对齐,所有你需要做的就是用0取代-1insert的第一个论点中{{1}}。