ruby数组,在所有数组实例中保存数据,euler 18

时间:2013-04-03 20:07:12

标签: ruby multidimensional-array

以下代码

#!/usr/bin/ruby -w

nums = File::read("euler18nums.txt");   #opens file with number array inside.
parts = nums.split(' ');                #save it into instance of an array.
t = []                                  #dimension one of the array of arrays.
s = []                                  #dimension two.
j=0                                     #iteration variable.
k=0                                     #iteration variable.
n=1                                     #iteration variable.
parts.collect do |i|                    #itterates through the array that i have my data in.
    s[k] = i.to_i                       #converts strings to int and save into 2nd dimension.
    k+=1
    if k == n                           #number of itterations increase by one every time function is called.
        t[j] = s                        
        n+=1                            #saves second dimension of array into the first,-
        k=0                             #-and this is  where my problem is because it saves into and overwrites-
        test=0                          #-of the array that i have saved.
        while test != n                 #this is a test statement to print out the array so far-
            print t[test], "\n"         #-every time a new array is saved into it
            test+=1
        end
        j+=1
    end
end
print t                                 #prints out at the end, this is always just the last-
                                        #-array printed out fifteen times

每当我将s保存到t [j]时,它会保存并覆盖到目前为止已经创建的t的所有实例,我误解了ruby数组,我假设t[5] = s并且不会影响{{1 }或t[4]等。有没有办法做到这一点,其中ruby只保存特定实例的数组或我需要回到t[3]为此? 这个的txt文件是

C++

也发现于http://projecteuler.net/problem=18

2 个答案:

答案 0 :(得分:1)

看起来t的每个元素都是完全相同的s数组,最终的t看起来像这样:

t[0] ---\
t[1] ----+--> s
t[2] ---/

执行此操作时:

t[j] = s

你所做的就是将一个数组的引用分配给t[j],你没有制作s数组的副本,而你只是制作另一个数组参考它。如果s是数组或指针,则行为与C或C ++中的行为完全相同。

我不确定您使用t[j] = s尝试完成的任务,但您可能希望将s的副本分配给t[j]

t[j] = s.dup

答案 1 :(得分:0)

问题不是“覆盖”,而是你只创建了一个二维数组(你指向s)。因此,您正在将指向同一对象的指针写入每个t[j]

s = []移动到代码中您希望启动新的第二维数组的位置。

如果您想在目前的数组中保留现有数字,请执行类似

的操作
s = s.clone

。 。 。将(浅)将数组的现有内容复制到新的内容,并在其上指向s