Java中的二维ArrayList数组与三维ArrayList

Java中的二维ArrayList数组与三维ArrayList,java,arrays,arraylist,Java,Arrays,Arraylist,我需要在固定长度的2D数组中存储未知数量对象的列表。例如,我有一个二维阵列: int[][] clashesMatrix = new int[noOfExams][noOfExams]; 在每个碰撞矩阵位置,我需要一个带有学生对象的动态大小的arraylist。 我试着这样做: ArrayList<Student>[][] clashesMatrix2 = new ArrayList<Student>[][]; ArrayList[][]冲突矩阵x2=新的ArrayL

我需要在固定长度的2D数组中存储未知数量对象的列表。例如,我有一个二维阵列:

int[][] clashesMatrix = new int[noOfExams][noOfExams];
在每个碰撞矩阵位置,我需要一个带有学生对象的动态大小的arraylist。 我试着这样做:

ArrayList<Student>[][] clashesMatrix2 = new ArrayList<Student>[][];
ArrayList[][]冲突矩阵x2=新的ArrayList[]];
但这会产生语法错误:
无法创建ArrayList的通用数组。有没有一种方法可以让我用这个来实现我的目标

当然,还有另一种选择,即使用三维ArrayList

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

为此,您建议使用什么?如果我使用3D arraylist的第二个选项,那么初始化所有arraylist的最佳方法是什么,因为在开始时所有内容都是空的?循环并初始化我需要的所有ArrayList是否会造成开销?

您可以尝试此操作,但会收到编译器警告

ArrayList<Student>[][] clashesMatrix2 = (ArrayList<Student>[][]) java.lang.reflect.Array.newInstance(ArrayList.class,noOfExams,noOfExams);
ArrayList[][]冲突矩阵x2=(ArrayList[][])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);
@SuppressWarnings(“未选中”)
ArrayList[][]冲突矩阵X2=(ArrayList[][])java.lang.reflect.Array.newInstance(ArrayList.class、noOfExams、noOfExams);

有关这方面的更多信息,请参见

类似的结构,这几乎总是物体恐惧症的征兆。对于这个特殊的问题,我可能会从图书馆找一份工作。否则,编写一些对象来封装您的结构。我会使用
ArrayList
,但您为什么要关心初始化?你不能推迟初始化直到你需要每个列表吗?@BoristheSpider谢谢你的链接。事实上,我已经将番石榴图书馆用于其他目的。我只是没碰到桌子。我想我会试试看。@DavidWallace你为什么会选择ArrayList?是否仅仅因为混合动态和固定结构不是一个好主意?关于初始化,我想你是对的,不应该有什么不同。@Bernice,正如你所注意到的,泛型和数组是不会混合的。这有点像油和水——你当然可以强迫它们混合,但这很混乱。如果可能的话,我会避免泛型类型的数组。然而,数组的一般类型是fine-
List
。这正是我的观点-Guava封装了一个结构并提供了一个访问它的接口-这就是OOP的全部内容。谢谢你的回答。我知道是的,但正如@Boristeider所指出的,这不是很推荐。相反,我选择了番石榴图书馆的HashBasedTable。