我有一个这样的数组:
[[1,2],[2],[3,4,5,6],[7]]
我想用nil
填充数组元素。我如何得到这个结果:
[[1,2,nil,nil],[2,nil,nil,nil],[3,4,5,6],[7,nil,nil,nil]]
我试过了:
arr=[[1,2],[2],[3,4,5,6],[7]]
l=arr.max_by{|x|x.size}.size
arr.map{|x|x+[nil]* (l-x.size)}
有更简单的方法吗?
答案 0 :(得分:7)
正统的方式是:
a = [[1,2], [2], [3, 4, 5, 6], [7]]
max = a.map(&:length).max - 1
a.each{|a| a[max] ||= nil}
# => [[1, 2, nil, nil], [2, nil, nil, nil], [3, 4, 5, 6], [7, nil, nil, nil]]
更有趣的方式是:
a = [[1,2], [2], [3, 4, 5, 6], [7]]
a.max_by(&:length).zip(*a).transpose.drop(1)
# => [[1, 2, nil, nil], [2, nil, nil, nil], [3, 4, 5, 6], [7, nil, nil, nil]]
答案 1 :(得分:1)
这样做:
a = [[1,2],[2],[3,4,5,6],[7]]
longest = a.max_by(&:size).size
a.map { |e| e + [nil]*(longest-e.size) }
#=> [[1, 2, nil, nil], [2, nil, nil, nil], [3, 4, 5, 6], [7, nil, nil, nil]]
另一种方式:
b = (0...a.max_by(&:size).size).to_a
#=> [0, 1, 2, 3]
a.map { |e| e.values_at *b }
#=> [[1, 2, nil, nil], [2, nil, nil, nil], [3, 4, 5, 6], [7, nil, nil, nil]]
最后(我保证):
longest = a.max_by(&:size).size
a.map { |e| f=e.dup; ([nil]*longest).map { f.shift } }
#=> [[1, 2, nil, nil], [2, nil, nil, nil], [3, 4, 5, 6], [7, nil, nil, nil]]