填充从文件中读取的ruby数组

时间:2014-09-26 17:43:29

标签: ruby arrays

我正试图通过从文件中读取来填充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

在我为数组赋值的块中打印正确的字符。它在合适的时间打印空格和问号等...我知道这是非常简单的东西,但它让我烦恼,我想我需要一双新眼睛来看它

为什么数组只有“#”符号。为什么不是所有其他字符,如“”,“@”,“?”在我的阵列?我的代码中的分配是否编码错误

2 个答案:

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