我有一个大小为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>();
}
}
我已经知道如何在1D中执行此操作:
ArrayList<Integer>[] i1DArrayList;
i1DArrayList = new ArrayList[n];
for (int i = 0; i < i1DArrayList.length; i++) {
i1DArrayList[i] = new ArrayList<Integer>();
}
答案 0 :(得分: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[]
或new List<T>[]
。原因是数组还存储其元素类型以允许在运行时检查元素类型。但是,类型擦除会在编译时删除这些泛型类型,因此无法为new 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];
如果您知道矩阵稀疏,则可以使用Map<Position, List<Integer>>
,Position
使用x
和y
字段的值类。