使用ArrayLists创建矩阵

时间:2016-05-06 17:55:20

标签: java matrix arraylist

我想创建一个包含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的内容??

6 个答案:

答案 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中,如果您清除intListmainList中的信息也会丢失。 一个解决方案:在每个循环中创建一个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");
                
    }
    
}