【问题标题】:Creating a Matrix with ArrayLists使用 ArrayLists 创建矩阵
【发布时间】:2016-05-06 17:55:20
【问题描述】:

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

【问题讨论】:

  • 你不能只声明一个新的 ArrayList newList = new ArrayList(intList);然后将其添加到 mainList 而不是 intList?

标签: java matrix arraylist


【解决方案1】:

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

【讨论】:

  • sandBo00 我明白了...为每一行创建一个实例可能会在更多行 (>=100000) 时降低性能。
  • @Ramses 我刚刚测试了 120000 行和 10 列,每个位置都填充了一个随机整数,这在我的机器上几乎没有时间;-)
【解决方案2】:

是的,你的预感是正确的。 intList.clear(); 是问题所在。 因为intList 存储在mainList 中,如果您清除intListmainList 中的信息也会丢失。 一个解决方案:在每个循环中创建一个new intList 但是因为矩阵的尺寸通常不可变 - Arraylists 是 - 您应该考虑使用 int[][] intList 来进行矩阵。

【讨论】:

    【解决方案3】:

    Java 使用引用。因此,在您的程序中,mainList 将包含 5 个对同一唯一 intList 的引用。您对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("");
            }
        }
    }
    

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

    【讨论】:

      【解决方案4】:

      只需要在 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("");
                      }
                  }
              }
      

      【讨论】:

      • 您必须删除intList.clear(); 行,否则列表仍然是空的。
      • @Maxqueue 您的解决方案仅在您删除行 intList.clear() 时有效:-)
      【解决方案5】:

      我会创建 n- 或 m- ArrayLists,这取决于您要如何使用它。

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

      【讨论】:

        【解决方案6】:

        这是我在 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");
                        
            }
            
        }
        

        【讨论】:

          猜你喜欢
          • 2020-07-09
          • 1970-01-01
          • 2018-02-15
          • 1970-01-01
          • 2020-10-25
          • 2012-03-28
          • 2014-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多