我想创建一个包含n行和m列的ArrayList-matrix,例如
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("");
}
}
}
是否有可能在不清除的情况下清除 intList 的内容 mainList的内容??
答案 0 :(得分:1)
只需要在for循环中移动intList的创建,现在应该可以工作。
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("");
}
}
}
答案 1 :(得分:1)
调用mainList.add(intList);
时,您要将指向intList对象的引用添加到mainList中,而不是复制值。您必须每行创建一个“intList”实例,而不是清除任何内容。
答案 2 :(得分:1)
是的,你的预感是正确的。行intList.clear();
是问题所在。
由于intList
存储在mainList
中,如果您清除intList
,mainList
中的信息也会丢失。
一个解决方案:在每个循环中创建一个new intList
但是因为matrizes的维度通常不变 - Arraylists
是 - 你应该考虑使用int[][] intList
作为你的matrizes。
答案 3 :(得分:1)
Java与引用一起使用。因此,在您的计划中,mainList
将包含对同一个唯一intList
的5个引用。你对intList
做的任何事情都会反映在所有&#34;行&#34;在mainList
中,清除,更改值等
如果你想创建一个矩阵,你很可能希望每个&#34;行&#34;是对不同列表的引用。这可以通过在循环中实例化一个新列表来完成:
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("");
}
}
}
在你的程序中,清除中间列表是没有必要的。
答案 4 :(得分:0)
我会创建n-或m- ArrayLists,这取决于你想要如何使用它。
或者你创建一个hashmap&gt;对于每一行一个ArrayList。
答案 5 :(得分:0)
这是我在 arrayList 上显示 4*4 矩阵的目的
import java.util.ArrayList;
import java.util.Collections;
/**
*
* @author David Clavijo
*/
public class PuzzleShuffle {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ArrayList<Integer> blockNums = new ArrayList<>();
blockNums.add(1);
blockNums.add(2);
blockNums.add(3);
blockNums.add(4);
blockNums.add(5);
blockNums.add(6);
blockNums.add(7);
blockNums.add(8);
blockNums.add(9);
blockNums.add(10);
blockNums.add(11);
blockNums.add(12);
blockNums.add(13);
blockNums.add(14);
blockNums.add(15);
blockNums.add(0);
Collections.shuffle(blockNums);
for(Integer i: blockNums){
if (blockNums.indexOf(i)%4 == 0 && blockNums.indexOf(i)!=0){
System.out.println("\n");}
System.out.printf("%4d", i);
}
System.out.println("\n"+"\n"+"Matriz Random");
}
}