【问题标题】:How to populate a 2D array with arrays of different lengths so that they are all the same length, in ruby如何用不同长度的数组填充二维数组,以使它们的长度都相同,在红宝石中
【发布时间】:2015-02-18 07:27:54
【问题描述】:

在我的 Ruby 脚本中,我目前有一个二维数组,其中的元素都是长度不同的数组。在这个例子中,为简单起见,整数是每个数组的索引,可以被认为是所有字符串的真实值的占位符..

my_2D_array = 
[[1],
[1, 2, 3],
[1, 2, 3, 4, 5, 6, 7, 8],
[1, 2, 3, 4],
[1, 2],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[],
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6, 7]]

如何填充新的 2D 数组或操作现有的 2D 数组,以使所有数组的长度相同,并使用 nil 值填充新的 elelements?像这样:

my_2D_array = 
[[1, nil, nil, nil, nil, nil, nil, nil, nil],
[1, 2, 3, nil, nil, nil, nil, nil, nil],
[1, 2, 3, 4, 5, 6, 7, 8, nil],
[1, 2, 3, 4,, nil, nil, nil, nil, nil],
[1, 2, nil, nil, nil, nil, nil, nil, nil],
[1, 2, 3, 4, 5, nil, nil, nil, nil],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[nil, nil, nil, nil, nil, nil, nil, nil, nil],
[1, 2, 3, 4, 5, 6, nil, nil, nil],
[1, 2, 3, 4, 5, 6, 7, nil, nil]]

【问题讨论】:

  • 请注意,我试图通过研究 ruby​​ 数组操作来提出一个解决方案,但是虽然没有找到,但我的代码非常臃肿,所以我也在寻找很好的代码抽象使用ruby 中的各种技巧来获得相当模块化的东西。

标签: ruby arrays


【解决方案1】:
l = my_2D_array.map(&:length).max
my_2D_array.each{|e| e[l - 1] ||= nil}

【讨论】:

  • 我的脑子是不是快崩溃了?是的,是的。你太棒了!为简短和模块化 xD 竖起大拇指
  • 显然是一种极端情况,但e[l-1] ||= nil 可以覆盖false
  • @Stefan OP 说这些值都是字符串(或nil)。
【解决方案2】:

使用带有块的Array::new 构造相同大小的数组的方式略有不同:

size = my_2D_array.map(&:size).max 
my_2D_array.map { |ary| Array.new(size) { |i| ary[i] } }

这会返回一个新数组并且不会修改嵌套数组。

【讨论】:

  • 太棒了!这与我想在脚本中实现的目标非常相关!一旦我可以投票,+1 投票。
【解决方案3】:

试试:

max_size = my_2D_array.max_by(&:size).size

my_2D_array.each do |i|
   max_size.times {|j| i[j] = nil if i[j].blank? }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2016-09-09
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多