【发布时间】:2014-04-05 11:45:34
【问题描述】:
我需要在一个固定长度的二维数组中存储一个未知数量的对象列表。示例我有一个二维数组:
int[][] clashesMatrix = new int[noOfExams][noOfExams];
并且在每个冲突矩阵位置中,我需要一个带有 Student 对象的动态大小的数组列表。 我试着这样做:
ArrayList<Student>[][] clashesMatrix2 = new ArrayList<Student>[][];
但这会产生语法错误:Cannot create a generic array of ArrayList<Student>。有没有办法可以用这个来实现我的目标?
当然还有另一种选择来拥有一个 3 Dimensional ArrayList
ArrayList<ArrayList<ArrayList<Student>>> clashesMatrix = new ArrayList<ArrayList<ArrayList<Student>>>();
您建议为此目的使用什么?如果我使用 3D arraylists 的第二个选项,那么初始化所有 arraylist 的最佳方法是什么,因为当然一切一开始都是空的?这会是循环和初始化我需要的所有数组列表的开销吗?
【问题讨论】:
-
这样的结构几乎总是对象恐惧症的标志。对于这个特殊问题,我可能会从Guava 库中寻找Table<Integer, Integer. List<Student>>。否则写一些对象来封装你的结构。
-
我会使用
ArrayList<ArrayList<ArrayList<Student>>>,但是你为什么要关心初始化呢?你不能延迟初始化直到你需要每个列表吗? -
@BoristheSpider 感谢您的链接。实际上,我已经将 Guava 库用于其他目的。我只是没有遇到表。我想我会试一试。 @DavidWallace 为什么你会选择 arraylists 呢?仅仅是因为混合动态和固定结构不是一个好主意吗?关于初始化,我想你是对的,不应该有所作为。
-
@Bernice 正如您所注意到的,泛型和数组不能混合使用。这有点像油和水——当然,你可以强迫它们混合,但它很乱。如果可能的话,我会避免使用泛型类型的数组。但是,通用类型的数组很好 - 例如
List<String[]>。 -
这正是我的观点 - Guava 已经封装了一个结构并提供了一个访问它的接口 - 这就是 OOP 的全部内容。
List<List<?>>操作起来很痛苦,需要复制粘贴循环和空检查——这应该是一个巨大的危险信号。考虑一下ArrayTable子类,因为它的速度非常快,而且您似乎有一个固定的大小。