我正试图通过从文件中读取来填充ruby中的多维数组。这是代码:
class Maze
attr_accessor :array
def initialize(filename)
handler = File.open(filename,"r")
@array = Array.new(10,Array.new(10))
n = 0;
i = 0;
while(line = handler.gets) do
i = 0
line.chomp.each_char do |char|
p char
@array[n][i] = char
i += 1
end #iterator over character in every line
n += 1
end #iterator over file lines
handler.close
end #constructor
end #class
a = Maze.new("maze.txt")
p a.array
以下是文件的内容:
##########
# #
# #### #
# # # #
@ # # ?
# # # #
# # #
# #### #
# #
##########
然而这行代码(最后一行代码)
p a.array
将打印数组10乘10但充满“#”符号。没有空格也没有“?”。值得注意的是
p char
在我为数组赋值的块中打印正确的字符。它在合适的时间打印空格和问号等...我知道这是非常简单的东西,但它让我烦恼,我想我需要一双新眼睛来看它
为什么数组只有“#”符号。为什么不是所有其他字符,如“”,“@”,“?”在我的阵列?我的代码中的分配是否编码错误
答案 0 :(得分:1)
我以不同的方式编写代码。它不太清楚你要做什么,所以我要做的就是两件不同的事情:
class Maze
attr_accessor :array
def initialize(filename)
@array = []
File.foreach(filename) do |line|
@array << line.chomp
end
end
end
a = Maze.new("maze.txt")
p a.array
puts a.array
哪个输出:
["##########", "# #", "# #### #", "# # # #", "@ # # ?", "# # # #", "# # #", "# #### #", "# #", "##########"]
##########
# #
# #### #
# # # #
@ # # ?
# # # #
# # #
# #### #
# #
##########
或者:
class Maze
attr_accessor :array
def initialize(filename)
@array = []
File.foreach(filename) do |line|
@array << line.chomp.split('')
end
end
end
a = Maze.new("maze.txt")
p a.array
puts a.array.map(&:join)
输出:
[["#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["#", " ", " ", " ", " ", " ", " ", " ", " ", "#"], ["#", " ", "#", "#", "#", "#", " ", " ", " ", "#"], ["#", " ", "#", " ", " ", "#", " ", " ", " ", "#"], ["@", " ", "#", " ", " ", "#", " ", " ", " ", "?"], ["#", " ", "#", " ", " ", "#", " ", " ", " ", "#"], ["#", " ", "#", " ", " ", " ", " ", " ", " ", "#"], ["#", " ", "#", "#", "#", "#", " ", " ", " ", "#"], ["#", " ", " ", " ", " ", " ", " ", " ", " ", "#"], ["#", "#", "#", "#", "#", "#", "#", "#", "#", "#"]]
##########
# #
# #### #
# # # #
@ # # ?
# # # #
# # #
# #### #
# #
##########
代码中的主要问题是,当您分配给子数组时,您将使用数组引用,这会导致它们都指向同一个内存。我认为你这样做是因为你习惯了另一种语言,你必须预定义你的数组大小。 Ruby比这更友好,允许我们轻松附加到数组。我曾经使用<<
运算符,但是存在其他方法来执行相同的操作; <<
更容易看到和理解。
而不是打开文件,然后使用while
循环迭代它,使用foreach
更加惯用,它完成同样的事情并自动关闭文件阻止退出。
此外,不是迭代每个行的字符,只需使用split('')
分割行,这将返回一个字符数组。将其附加到@array
并继续。
答案 1 :(得分:0)
罪魁祸首就是你在这行中初始化数组的方式:
@array = Array.new(10,Array.new(10))
这是创建一个包含10个元素的数组,它正在使用指向另一个包含10个元素的数组的指针初始化所有元素。所有10个元素将共享相同的数组。您可以在此处查看简化示例:
b = Array.new(3,Array.new(3))
b[0][0] = '00'
puts b # you'll see '00' printed 3 times!
修复程序的一种方法是首先创建行数组,然后将每行初始化为不同的数组:
@array = Array.new(10)
for i in 0..9
# initialize each row to a unique array
@array[i] = Array.new(10)
end
# the rest of your code