【问题标题】:Referencing the Objects of 2D array into an ArrayList将二维数组的对象引用到 ArrayList
【发布时间】: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 实现,它的作用类似于视图,将自身的getset 操作引用到底层二维数组上的适当操作。
  • 您可以使用AbstractList 轻松执行@KevinAnderson 建议的操作...即使您即时计算位置(为了获得),它也可能没有您想的那么糟糕,因为您没有有额外的内存分配/副本正在进行(或者如果您知道二维数组很大,您可以预先计算所有行开头的索引...

标签: java arrays arraylist multidimensional-array


【解决方案1】:

我需要从 2D 数组创建一个 ArrayList,其中 ArrayList 用作数组的线性“视图”。

问题中提供的代码确实没有实现数组的视图。相反,它只是在某个时间点(浅层)复制数组的内容,随后是独立的。

可以创建自定义List 实现,使用您的二维数组作为后备元素存储。这可以这样实现,即List.set() 方法将后备存储中的相应引用替换为指定为参数的引用。这可以通过扩展 AbstractList 并覆盖(仅)get()set()size() 来实现。

但除了将ArrayList 作为基类进行类似操作之外,您无法通过专门的ArrayList 来实现您的目标。并且使用ArrayList 作为基础会有问题,因为使用ArrayList 可以做的一些事情,例如用add() 延长它或用remove() 缩小它,对于查看固定大小的对象,例如数组。

【讨论】:

  • 我不一定需要使用 ArrayList,只需实现 AbstractCollection 的一个版本来充当数组的视图。您能否详细说明如何使用所述数组作为后备存储?
  • @DanielMerueloMonzón,没什么好说的了。自定义List 保留对数组的引用,该数组最初可能作为构造函数参数提供。它将get() 实现为检索适当的数组元素并返回它。它通过将参数存储在适当的数组元素中来实现set()。它根据数组中元素的数量实现size()
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2017-01-18
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多