代码之家  ›  专栏  ›  技术社区  ›  matthieu994

二维数组int的arrayList

  •  1
  • matthieu994  · 技术社区  · 6 年前

    我想做一个二维数组的数组列表。 这是我添加到arrayList的同一个2维数组,但每次都有不同的值。 问题是:当我将数组添加到列表中时,它会自动更新列表中数组的其他版本。 我试图在将数组添加到列表之前克隆/复制它,但它没有任何效果。

    import java.util.*;
    
    public class Test {
       static ArrayList<int[][]> list = new ArrayList<int[][]>();
    
       public static void main(String[] args) {
          Lister L = new Lister();
       }
    
       public static void add(int[][] array) {
          list.add(array);
          printArray();
       }
    
       public static void printArray() {
          for (int i = 0; i < list.size(); i++) {
             System.out.println("Element: " + i);
             printDim(list.get(i));
          }
          System.out.println("--------------------------------");
       }
    
       public static void printDim(int[][] array) {
          for (int x = 0; x < array.length; x++) {
             for (int y = 0; y < array[0].length; y++) {
                System.out.print(array[y][x]+" ");
             }
             System.out.println();
          }
          System.out.println("-----------");
       }
    }
    
    class Lister {
       Lister() {
          int[][] array1 = new int[5][5];
          array1[0][4] = 1;
          Test.add(array1);
          int[][] array2 = array1.clone();
          array2[1][2] = 1;
          Test.add(array2);
       }
    }
    

    输出:

    Element: 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    1 0 0 0 0
    ---------------------
    Element: 0
    0 0 0 0 0
    0 0 0 0 0
    0 1 0 0 0
    0 0 0 0 0
    1 0 0 0 0
    -----------
    Element: 1
    0 0 0 0 0
    0 0 0 0 0
    0 1 0 0 0
    0 0 0 0 0
    1 0 0 0 0
    --------------------
    

    预期产量:

    Element: 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    1 0 0 0 0
    --------------------
    Element: 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    1 0 0 0 0
    -----------
    Element: 1
    0 0 0 0 0
    0 0 0 0 0
    0 1 0 0 0
    0 0 0 0 0
    1 0 0 0 0
    ---------------------
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Max Vollmer    6 年前

    不能浅复制二维数组。由于它是一个数组数组,浅拷贝将为您提供一个新的外部数组,其中包含对与原始数组相同的内部数组的引用。

    您需要实现一个深度拷贝:

    int[][] array2 = array1.clone();
    for (int i = 0; i < array2.length; i++) {
        array2[i] = array1[i].clone();
    }
    

    请不要认为这只适用于基元数组。如果有对象数组,则还需要复制每个对象(除了可以引用相同的对象)。

        2
  •  1
  •   Vallas    6 年前

    因为你仍然在使用同一类型的“矩阵” int . 在使用第一个之后,应该通过再次声明来解决这个问题。

    import java.util.*;
    
    class Test {
       static ArrayList<int[][]> list = new ArrayList<int[][]>();
    
       public static void main(String[] args) {
          int[][] array1 = new int[5][5];
          array1[0][4] = 1;
          list.add(array1);
    
          array1 = new int[5][5];
          array1[1][2] = 1;
    
          list.add(array1);
          printArray();
       }
    
       public static void printArray() {
          for (int i = 0; i < list.size(); i++) {
             printDim(list.get(i));
          }
       }
    
       public static void printDim(int[][] array) {
          for (int x = 0; x < array.length; x++) {
             for (int y = 0; y < array[0].length; y++) {
                System.out.print(array[y][x]+" ");
             }
             System.out.println();
          }
          System.out.println("--------");
       }
    }