2014-09-26 47 views
0

我想通過閱讀文件來填充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

你的問題是什麼? – sawa 2014-09-26 18:07:49

+0

爲什麼數組只有「#」符號。爲什麼不是所有其他字符,如「」,「@」,「?」在我的陣列?我的代碼中的賦值錯誤地編碼了嗎? – Bula 2014-09-26 18:20:40

+1

將您的評論置於您的問題中,因爲它定義了您要做的事情。 – 2014-09-26 18:56:42

回答

1

我'd寫代碼的方式不同。這不是很清楚你想要做什麼,所以這裏的兩個不同的事情,我會怎麼做:

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) 

其輸出:

[["#", "#", "#", "#", "#", "#", "#", "#", "#", "#"], ["#", " ", " ", " ", " ", " ", " ", " ", " ", "#"], ["#", " ", "#", "#", "#", "#", " ", " ", " ", "#"], ["#", " ", "#", " ", " ", "#", " ", " ", " ", "#"], ["@", " ", "#", " ", " ", "#", " ", " ", " ", "?"], ["#", " ", "#", " ", " ", "#", " ", " ", " ", "#"], ["#", " ", "#", " ", " ", " ", " ", " ", " ", "#"], ["#", " ", "#", "#", "#", "#", " ", " ", " ", "#"], ["#", " ", " ", " ", " ", " ", " ", " ", " ", "#"], ["#", "#", "#", "#", "#", "#", "#", "#", "#", "#"]] 
########## 
#  # 
# #### # 
# # # # 
@ # # ? 
# # # # 
# #  # 
# #### # 
#  # 
########## 

主要問題我n你的代碼是你在分配給子數組時使用數組引用,這導致它們都指向相同的內存。我想你是這麼做的,因爲你習慣於另一種語言,你必須預先定義你的數組大小。 Ruby比這更友好,讓我們可以輕鬆地添加到數組中。我曾經使用過<<算子,但也有其他方法可以做同樣的事情; <<更容易看到和理解。

而不是打開文件,然後使用while循環來遍歷它,它更習慣於使用foreach,它會完成相同的事情,並在塊退出時自動關閉文件。

此外,不是遍歷每行的字符,而是使用split('')簡單地拆分行,這將返回一個字符數組。追加到@array繼續前進。

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