java - 二维数组 int 的 ArrayList

标签 java arrays list arraylist int

我正在尝试创建一个二维数组的 ArrayList。 它与我添加到 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
---------------------

最佳答案

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

您需要实现深层复制:

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

请注意,这仅适用于原始数组。如果您有对象数组,则还需要复制每个对象(除非您愿意引用相同的对象)。

关于java - 二维数组 int 的 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666133/

相关文章:

python:对具有相同第一个元素的元组的元素进行分组

c++ - 在 C/C++ 中将十六进制数组作为字符串写入文件

c# - 如何在 C# 中使用窗口窗体创建动态下拉列表

java - 无法通过 java-client 连接到 Dockerized elasticsearch

java - 不会溢出的变量

php mysql更新sku不在数组中的行

c++ - 寻找同构排列集的算法

python - 在列表中找到第 n 个最小的数字?

java - 如何比较 Fraction 和 int?

java - Jsoup选择并迭代所有元素