我想要一个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)
这不是我想要的.
如何获得我想要的输出?
我建议你使用类方法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)
这里最大的问题是你不是像你想象的那样创建一个二维数组,而是你创建了两个数组.这是因为您传入一个单数组作为默认值,而不是一个可以生成它们的块.
你期待的是这个:
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的回答中添加,使得这个工作使用任意数字.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |