我需要为绘图和分析准备一些数据,并且可以使用一些建议来转换这些数据。
我有一个数组数组。每个子数组是一组收集的数据,最后一个元素代表所有数据的最新数据。早期元素代表历史数据。子阵列具有可变数量的历史。我想处理数组,以便当前数据(每个子数组中的最后一个元素)与右边界对齐。
例如:
[[2], [3, 5, 8, 9], [2, 10]]
应转换为或处理,如同:
[[nil, nil, nil, 2], [3, 5, 8, 9], [nil, nil, 2, 10]]
如果可能的话,我宁愿不改变原始数据,但是如果它有帮助就可以处理它(我会先将full_dup数组用于数据并处理副本)
答案 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]]
你可以使用类似的while
或until
循环,我认为看起来更好但是你会面对成语警察的愤怒。另外,使用unshift
或insert
需要dup
这是不理想的。
我在这里使用insert 0, nil
而不仅仅是unshift nil
的原因是因为你想要左对齐,所有你需要做的就是用0
取代-1
在insert
的第一个论点中{{1}}。