【发布时间】:2021-06-14 18:34:38
【问题描述】:
我需要从 2D 数组创建一个 ArrayList,其中 ArrayList 用作数组的线性“视图”。困扰我的是,当我更改原始数组的某些元素的值时,它在列表中没有改变。在调试时,我观察到对数组中对象的引用发生了变化,但在列表中保持不变。这就是我初始化列表的方式:
public class ColeccionArray2D<E> extends AbstractCollection<E> {
private ArrayList<E> data = new ArrayList<E>();
private int size = 0;
public ColeccionArray2D(E[][] contenido) {
data = twoDArrayToList(contenido);
this.size = data.size();
}
public ArrayList<E> twoDArrayToList(E[][] twoDArray) {
int index = 0;
ArrayList<E> list = new ArrayList<E>();
for (int i = 0; i < twoDArray.length; i++) {
for (int j = 0; j < twoDArray[i].length; j++) {
list.add(index, twoDArray[i][j]);
index++;
}
}
return list;
}
但是如果我改变原来的数组:
arrayInteger[0][0] = -1;
数组上的引用发生了变化,但它在列表中保持不变,因为在 Integer 对象中没有变化。 我最好的猜测是我需要在操作发生时“更新”视图,但这违背了引用原始数组元素的目的。 有没有办法将索引的引用(例如[0][0])添加到列表中?那么当里面的对象发生变化时,列表中的对象也会发生变化?
【问题讨论】:
-
ArrayList无法满足您的需求,因为ArrayList基本上是您的二维数组的副本,而不是它的“视图”。您需要一个自定义的List实现,它的作用类似于视图,将自身的get和set操作引用到底层二维数组上的适当操作。 -
您可以使用AbstractList 轻松执行@KevinAnderson 建议的操作...即使您即时计算位置(为了获得),它也可能没有您想的那么糟糕,因为您没有有额外的内存分配/副本正在进行(或者如果您知道二维数组很大,您可以预先计算所有行开头的索引...
标签: java arrays arraylist multidimensional-array