0

我有一个大小为 nXm 的 2D 矩阵,其中每个单元格包含未知数量的 Integer 类型的值(因此我必须使用 List 才能动态添加内容,并且必须使用 2D 数组 nXm 因为数组很容易访问和编写代码)。PL

  • 在向我推荐任何其他数据结构之前先轻松一下,然后在下面回答我的问题,然后讨论为什么我不应该这样做,并选择你认为会更好、更有效的方法:

如何为下面的变量分配内存

 ArrayList<Integer>[][] i2DArrayList;

我知道在某些时候我必须这样做。但是在此之前我必须做一些我不记得知道的其他内存分配。你能在这件事上指导我吗?

for (int i = 0; i < n; i++) {   
            for (int j = 0; j < m; j++) {
                i2DArrayList[i][j] = new ArrayList<Integer>();    
    }
}

我已经知道如何在一维中做到这一点:

ArrayList<Integer>[] i1DArrayList;

i1DArrayList = new ArrayList[n]; 
    for (int i = 0; i < i1DArrayList.length; i++) {
        i1DArrayList[i] = new ArrayList<Integer>();
    }
4

1 回答 1

1

只需使用多维数组初始化器:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][m];

这相当于:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][];
for (int i = 0; i < n; i++) {   
    i2DArrayList[i] = new ArrayList<Integer>[m];
}

Java 不允许您分配泛型数组。也就是说,您不能制作new T[]or new List<T>[]。原因是数组还存储它们的元素类型以允许在运行时检查元素。但是,类型擦除会在编译时删除这些泛型类型,因此不能将有效的元素类型分配给 anew T[]new List<T>[]。虽然有一些解决方案:

  • 也可以使用某种Collection类型来存储矩阵。例如:

    List<List<List<Integer>>> i2DArrayList = new ArrayList<List<List<Integer>>>();
    

    然而,这真的很快变得丑陋。

  • 您可以创建自己的非泛型入口类:

    class Entry {
        final List<Integer> entries = new ArrayList<Integer>();
    }
    
    Entry[][] i2DArrayList = new Entry[n][m];
    
  • 如果你知道你的矩阵是稀疏的,你可以使用 aMap<Position, List<Integer>>来代替,它带有一个带有和字段Position的值类。xy

于 2013-06-07T20:44:00.333 回答