用nil填充数组元素

时间:2014-06-27 05:03:23

标签: ruby arrays

我有一个这样的数组:

[[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)}

有更简单的方法吗?

2 个答案:

答案 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]]