Java 使用ArrayList创建矩阵

Java 使用ArrayList创建矩阵,java,matrix,arraylist,Java,Matrix,Arraylist,例如,我想创建一个包含n行和m列的ArrayList矩阵 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 我已经编写了创建这样一个矩阵的代码,但是当我清除包含列数据的列表时,我的代码不会显示值。这是我的 package testproject; import java.util.ArrayList; public class TestProject { public static void

例如,我想创建一个包含n行和m列的ArrayList矩阵

   1 2 3 4 5

   1 2 3 4 5 

   1 2 3 4 5

   1 2 3 4 5

   1 2 3 4 5
我已经编写了创建这样一个矩阵的代码,但是当我清除包含列数据的列表时,我的代码不会显示值。这是我的

package testproject;

import java.util.ArrayList;

public class TestProject {

    public static void main(String[] args) {
        ArrayList<Integer> intList = new ArrayList<>();
        ArrayList<ArrayList<Integer>> mainList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            for (int k = 0; k < 5; k++) {
                intList.add(k);
            }
            mainList.add(intList);
            intList.clear(); //this line is probably the problem
        }
        for (int row = 0; row < mainList.size(); row++) {
            for (int col = 0; col < mainList.get(0).size(); col++) {
                System.out.print(mainList.get(row).get(col) + ",");
            }
            System.out.println("");
        }
    }
}
包测试项目;
导入java.util.ArrayList;
公共类测试项目{
公共静态void main(字符串[]args){
ArrayList intList=新的ArrayList();
ArrayList mainList=新的ArrayList();
对于(int i=0;i<10;i++){
对于(int k=0;k<5;k++){
intList.add(k);
}
mainList.add(intList);
intList.clear();//这一行可能就是问题所在
}
对于(int row=0;row
是否有可能在不清除intList的情况下清除intList的内容
mainList的内容???

我会创建n-或m-数组列表,这取决于您想如何使用它


或者为每行创建一个hashmap>,一个ArrayList。

我会创建n或m-ArrayList,这取决于您想如何使用它


或者为每行创建一个hashmap>,一个ArrayList。

只需将intList的创建移到for循环中,现在就可以了

import java.util.ArrayList;
        public class TestProject {
            public static void main(String[] args) {
                ArrayList<ArrayList<Integer>> mainList = new ArrayList<>();
                for(int i=0;i<10;i++) {
                    ArrayList<Integer> intList = new ArrayList<>();
                    for(int k=0;k<5;k++) {
                        intList.add(k);
                    }
                    mainList.add(intList);
                }
                for(int row=0;row<mainList.size();row++) {
                    for(int col=0;col<mainList.get(0).size();col++) {
                        System.out.print(mainList.get(row).get(col)+",");
                    }
                    System.out.println("");
                }
            }
        }
import java.util.ArrayList;
公共类测试项目{
公共静态void main(字符串[]args){
ArrayList mainList=新的ArrayList();

for(inti=0;i只需要将intList的创建移到for循环中,现在就可以工作了

import java.util.ArrayList;
        public class TestProject {
            public static void main(String[] args) {
                ArrayList<ArrayList<Integer>> mainList = new ArrayList<>();
                for(int i=0;i<10;i++) {
                    ArrayList<Integer> intList = new ArrayList<>();
                    for(int k=0;k<5;k++) {
                        intList.add(k);
                    }
                    mainList.add(intList);
                }
                for(int row=0;row<mainList.size();row++) {
                    for(int col=0;col<mainList.get(0).size();col++) {
                        System.out.print(mainList.get(row).get(col)+",");
                    }
                    System.out.println("");
                }
            }
        }
import java.util.ArrayList;
公共类测试项目{
公共静态void main(字符串[]args){
ArrayList mainList=新的ArrayList();

对于(int i=0;i调用
mainList.add(intList);
您正在将指向intList对象的引用添加到mainList中,而不是复制值。在调用
mainList.add(intList)时,您必须每行创建一个“intList”实例,并且不清除任何内容。

您正在将指向intList对象的引用添加到mainList中,而不是复制值。您必须为每行创建一个“intList”实例,并且不清除任何内容。

是的,您的直觉是正确的。
intList.clear();
行是问题所在。 因为
intList
存储在
mainList
中,如果清除
intList
mainList
中的信息也会丢失。 一个解决方案是:在每个循环中创建一个
新的intList

但是因为矩阵通常在它们的维度上是不可变的,即<代码> ARAYLISTABS/CODE > -你应该考虑使用<代码> INT[][INTLIST/<代码>为你的矩阵。

是的,你的直觉是正确的。 因为

intList
存储在
mainList
中,如果清除
intList
mainList
中的信息也会丢失。 一个解决方案是:在每个循环中创建一个
新的intList

但是,因为矩阵通常在它们的维度上是不可变的,即<>代码> ARARYLISTABS/CODE > -您应该考虑使用<代码> INT[][]intList
用于矩阵。

Java使用引用。因此,在您的程序中,
mainList
将包含对同一唯一的
intList
的5个引用。对
intList
所做的任何操作都将反映在
mainList
中的所有“行”中,清除、更改值等

如果要创建矩阵,您很可能希望每个“行”都是对不同列表的引用。这可以通过在循环中实例化一个新列表来实现:

package testproject;

import java.util.ArrayList;

public class TestProject {

    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> mainList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            ArrayList<Integer> intList = new ArrayList<>(); // This creates a new list for each row.
            for (int k = 0; k < 5; k++) {
                intList.add(k);
            }
            mainList.add(intList);
        }
        for (int row = 0; row < mainList.size(); row++) {
            for (int col = 0; col < mainList.get(0).size(); col++) {
                System.out.print(mainList.get(row).get(col) + ",");
            }
            System.out.println("");
        }
    }
}
包测试项目;
导入java.util.ArrayList;
公共类测试项目{
公共静态void main(字符串[]args){
ArrayList mainList=新的ArrayList();
对于(int i=0;i<10;i++){
ArrayList intList=new ArrayList();//这将为每一行创建一个新列表。
对于(int k=0;k<5;k++){
intList.add(k);
}
mainList.add(intList);
}
对于(int row=0;row

在您的程序中,清除中间列表是不必要的。

Java与引用一起工作。因此,在您的程序中,
mainList
将包含对相同唯一的
intList
的5个引用。您对
intList
所做的任何操作都将反映在
mainList
中的所有“行”中,清除、更改值等

如果要创建矩阵,您很可能希望每个“行”都是对不同列表的引用。这可以通过在循环中实例化一个新列表来实现:

package testproject;

import java.util.ArrayList;

public class TestProject {

    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> mainList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            ArrayList<Integer> intList = new ArrayList<>(); // This creates a new list for each row.
            for (int k = 0; k < 5; k++) {
                intList.add(k);
            }
            mainList.add(intList);
        }
        for (int row = 0; row < mainList.size(); row++) {
            for (int col = 0; col < mainList.get(0).size(); col++) {
                System.out.print(mainList.get(row).get(col) + ",");
            }
            System.out.println("");
        }
    }
}
包测试项目;
导入java.util.ArrayList;
公共类测试项目{
公共静态void main(字符串[]args){
ArrayList mainList=新的ArrayList();
对于(int i=0;i<10;i++){
ArrayList intList=new ArrayList();//这将为每一行创建一个新列表。
对于(int k=0;k<5;k++){
intList.add(k);
}
mainList.add(intList);
}
对于(int row=0;row

在您的程序中,不需要清除中间列表。

您能否只声明一个新的ArrayList newList=new ArrayList(intList);然后将其添加到主列表中