【问题标题】:2D array of ArrayLists vs 3D ArrayList in JavaArrayLists 的 2D 数组与 Java 中的 3D ArrayList
【发布时间】: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&lt;Student&gt;。有没有办法可以用这个来实现我的目标?

当然还有另一种选择来拥有一个 3 Dimensional ArrayList

ArrayList<ArrayList<ArrayList<Student>>> clashesMatrix = new ArrayList<ArrayList<ArrayList<Student>>>();

您建议为此目的使用什么?如果我使用 3D arraylists 的第二个选项,那么初始化所有 arraylist 的最佳方法是什么,因为当然一切一开始都是空的?这会是循环和初始化我需要的所有数组列表的开销吗?

【问题讨论】:

  • 这样的结构几乎总是对象恐惧症的标志。对于这个特殊问题,我可能会从Guava 库中寻找Table<Integer, Integer. List<Student>>。否则写一些对象来封装你的结构。
  • 我会使用ArrayList&lt;ArrayList&lt;ArrayList&lt;Student&gt;&gt;&gt;,但是你为什么要关心初始化呢?你不能延迟初始化直到你需要每个列表吗?
  • @BoristheSpider 感谢您的链接。实际上,我已经将 Guava 库用于其他目的。我只是没有遇到表。我想我会试一试。 @DavidWallace 为什么你会选择 arraylists 呢?仅仅是因为混合动态和固定结构不是一个好主意吗?关于初始化,我想你是对的,不应该有所作为。
  • @Bernice 正如您所注意到的,泛型和数组不能混合使用。这有点像油和水——当然,你可以强迫它们混合,但它很乱。如果可能的话,我会避免使用泛型类型的数组。但是,通用类型的数组很好 - 例如List&lt;String[]&gt;
  • 这正是我的观点 - Guava 已经封装了一个结构并提供了一个访问它的接口 - 这就是 OOP 的全部内容。 List&lt;List&lt;?&gt;&gt; 操作起来很痛苦,需要复制粘贴循环和空检查——这应该是一个巨大的危险信号。考虑一下 ArrayTable 子类,因为它的速度非常快,而且您似乎有一个固定的大小。

标签: java arrays arraylist


【解决方案1】:

你可以试试这个,但你会得到一个编译器警告

ArrayList<Student>[][] clashesMatrix2 = (ArrayList<Student>[][]) java.lang.reflect.Array.newInstance(ArrayList.class,noOfExams,noOfExams);

你可以这样做来抑制警告

@SuppressWarnings("unchecked")
ArrayList<Student>[][] clashesMatrix2 = (ArrayList<Student>[][]) java.lang.reflect.Array.newInstance(ArrayList.class,noOfExams,noOfExams);

更多信息请访问http://www.ibm.com/developerworks/java/library/j-jtp01255/index.html

【讨论】:

  • 感谢您的回答。我知道是的,但正如@BoristheSpider 指出的那样,这不是很推荐。相反,我选择了 Guava 库 HashBasedTable。
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 2014-09-27
  • 1970-01-01
  • 2016-04-17
  • 2012-03-18
  • 1970-01-01
  • 2020-04-04
  • 2018-02-15
相关资源
最近更新 更多