在Ruby中初始化2d数组

anu*_*anu 1 ruby arrays

我想要一个2d数组初始化如下

1 0 0 0
0 2 0 0
0 0 3 0
0 0 0 4
Run Code Online (Sandbox Code Playgroud)

"1234"给出输入字符串时.

我的功能如下

def fun(str)
    maxlength = Array.new(str.length,Array.new(str.length,0))
    (0..str.length-1).each do |i|
        maxlength[i][i] = str[i].to_i
    end
    print maxlength
end

print fun("1234")
Run Code Online (Sandbox Code Playgroud)

这给了我

1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.

如何获得我想要的输出?

Car*_*and 7

我建议你使用类方法Matrix :: diagonal:

require 'Matrix'

str = "1234"

Matrix.diagonal(*(str.chars.map(&:to_i))).to_a
  # => [[1, 0, 0, 0],
  #     [0, 2, 0, 0],
  #     [0, 0, 3, 0],
  #     [0, 0, 0, 4]] 
Run Code Online (Sandbox Code Playgroud)

其他方式:

Array.new(str.size) {|i| Array.new(str.size) {|j| (i==j) ? str[i].to_i : 0}}
  # => [[1, 0, 0, 0],
  #     [0, 2, 0, 0],
  #     [0, 0, 3, 0],
  #     [0, 0, 0, 4]] 
Run Code Online (Sandbox Code Playgroud)


tad*_*man 5

这里最大的问题是你不是像你想象的那样创建一个二维数组,而是你创建了两个数组.这是因为您传入一个单数组作为默认值,而不是一个可以生成它们的块.

你期待的是这个:

array1 = [ array21, array22, array23, array24 ]
Run Code Online (Sandbox Code Playgroud)

你实际得到的是这个:

array1 = [ array2, array2, array2, array2 ]
Run Code Online (Sandbox Code Playgroud)

通过将最后一个参数转换为块可以轻松修复此问题:

def fun(str)
    maxlength = Array.new(str.length) { Array.new(str.length,0) }
    str.chars.collect(&:to_i).each_with_index do |v,i|
        maxlength[i][i] = v
    end
    print maxlength
end

print fun("1234")
Run Code Online (Sandbox Code Playgroud)

我也切换到使用chars哪个分割字符串你想要的.

所以问题是你正确设置位置,但由于所有二级数组都是相同的数组,你没有得到你期望的结果.

更新:each_with_index从Chris的回答中添加,使得这个工作使用任意数字.