使用ArrayList的ArrayList创建螺旋顺序矩阵

时间:2016-08-27 00:39:15

标签: java matrix arraylist spiral

我正在尝试使用此问题生成Spiral Matrix: 给定整数n,以螺旋顺序生成填充有从1到n的平方元素的方阵。例如,给定n = 4,

我正在尝试使用返回类型的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 个答案:

答案 0 :(得分: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,然后您将ArrayList a次添加到{{} 1}}。这意味着每个res只会引用相同的res.get(n)实例。也就是说,您的所有“行”最终都是完全相同的ArrayList

您需要为每一行实例化一个新的ArrayList,例如:

ArrayList