2016-08-27 8 views
0

この問題を考慮して、スパイラル行列を生成しようとしています。 整数nを指定すると、1からnまでの2乗の要素で満たされた正方行列をスパイラル順に生成します。たとえば、与えられたn = 4、ArrayListのArrayListを使用したスパイラル順序行列の作成

私は行列を生成するためにArrayListの戻り値の型を持つことを試みています。

私の問題は、生成が始まるたびに、列ごとに列ごとに更新され、各行と列に対して同じ値になることです。ここで

は私のコードです:

public static ArrayList<ArrayList<Integer>> generateMatrix(int a) { 
    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); 

    //to create place holder for each element at the start - 0 
    ArrayList<Integer> zero = new ArrayList<Integer>(); 
    for (int i=0; i<a; i++) { 
     zero.add(0); 
    } 
    for (int i=0; i<a; i++) { 
     res.add(zero); 
    } 

    int numToAdd = 1; 
    int top = 0; 
    int bottom = a-1; 
    int left = 0; 
    int right = a-1; 


    while (numToAdd <= a*a) { 
     for (int i = left; i<= right; i++) { 
      res.get(top).set(i, numToAdd); 
      numToAdd++; 
     } 
     top++; 

     for (int i = top; i <= bottom; i++) { 
      res.get(i).set(right, numToAdd); 
      numToAdd++; 
     } 
     right--; 

     for (int i=right; i>=left; i--) { 
      res.get(bottom).set(i, numToAdd); 
      numToAdd++; 
     } 
     bottom--; 

     for(int i=bottom; i>= top; i--) { 
      res.get(i).set(left, numToAdd); 
      numToAdd++; 
     } 
     left++; 
    } 

    return res; 
} 

答えて

1

あなたの問題はここにある:

//to create place holder for each element at the start - 0 
ArrayList<Integer> zero = new ArrayList<Integer>(); 
... 
for (int i=0; i<a; i++) { 
    res.add(zero); 
} 

は基本的に、あなただけ単一新しい "行" ArrayListを作成しました、あなたが追加しました同じArrayListaからresまでです。つまり、すべてres.get(n)は、同じArrayListインスタンスを参照するだけです。つまり、すべての「行」はまったく同じArrayListになります。

次の例のように、代わりに各列のための新しいArrayListをインスタンス化することをお勧めします:

for (int i=0; i<a; i++) { 
    // for each row make a *new* arraylist 
    ArrayList<Integer> zero = new ArrayList<Integer>(); 
    // initialize that arraylist 
    for (int j=0; j<a; j++) { 
     zero.add(0); 
    } 
    // then add it to the row 
    res.add(zero); 
} 
完璧な作品
+0

。私はそれに気付かなかった! – tdel

関連する問題