java - 使用 ArrayList 的 ArrayList 创建螺旋阶矩阵

标签 java matrix arraylist spiral

考虑到这个问题,我正在尝试生成螺旋矩阵: 给定一个整数 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;
}

最佳答案

您的问题在这里:

//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 次到 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);
}

关于java - 使用 ArrayList 的 ArrayList 创建螺旋阶矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176376/

相关文章:

python - Numpy,如何使用 bool 切片获取子矩阵

matrix - 使用cuda乘以数百个矩阵

java - 将对象数组转换为 ArrayList 时出现问题

java - 如何将通用项添加到通用 ArrayList?

java - 错误: If a primary key is annotated with autoGenerate,其类型必须是int、Integer、long或Long

java - 我如何在 spigot api 中的命令上打印可点击的链接

java - 如何计算插入排序中的比较和交换次数? (JAVA)

c++ - 如何使用特征库进行 lu 分解 C++

java - 将对象序列化到 dat 文件中

java - Docker:Play 框架应用程序退出,代码为 0