如何在Java中创建一个二维ArrayList?

33
我希望创建一个2D数组,每个单元格都是一个ArrayList! 我考虑这些定义,但我不能添加任何内容。这些定义是否正确?
ArrayList<ArrayList<String>> table = new ArrayList<ArrayList<String>>();
或者
ArrayList[][] table = new ArrayList[10][10];

//table.add??????
请帮助我。

1
这将会帮助你:https://dev59.com/62gv5IYBdhLWcg3wNeHS - newuser
你好。问题的标题与其内容不一致。你想要一个二维数组的ArrayList(类似于三维),还是一个二维ArrayList(ArrayList的ArrayList)?如果这是你的作业问题,能否提供原始问题的文本。 最后,你是否一定需要声明ArrayList。你可以使用list代替吗? - C.Champagne
哦,你在问题的第一部分中声明了一个二维字符串ArrayList。你需要将String放入内部ArrayList中吗? - C.Champagne
5个回答

60

我想创建一个二维数组,每个单元格都是一个ArrayList!

如果你想要创建一个由ArrayList构成的二维数组,可以这样做:

ArrayList[][] table = new ArrayList[10][10];
table[0][0] = new ArrayList(); // add another ArrayList object to [0,0]
table[0][0].add(); // add object to that ArrayList

只有当arrayListObject不是ArrayList对象时,编译器才会报错。 - AllTooSir
2
table [0][0] 为空,因此首先需要初始化它。 - dijkstra
除了空值方面的问题,这是我们在这里看到的最好的解决方案。+1 - christopher
谢谢,我忽略了它。 - AllTooSir
实际上,我收到了一个警告“未经检查的调用add(e)作为原始类型的成员”,即内部arraylist的数据类型未指定,如何解决? - ShashankAC

51

最好的方法是在一个List内使用另一个List

List<List<String>> listOfLists = new ArrayList<List<String>>();  

35

首先,在Java中声明变量时,即使在实例化时指定了具体的实现,也应该使用接口进行声明。

ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>();

应该被书写

List<List<String>> listOfLists = new ArrayList<List<String>>(size); 

那么您需要实例化您的二维数组的所有列

    for(int i = 0; i < size; i++)  {
        listOfLists.add(new ArrayList<String>());
    }

而你将会像这样使用它:

listOfLists.get(0).add("foobar");

但是,如果您真的想要创建一个每个单元格都是ArrayList的2D数组!

那么你必须按照Dijkstra的方法去做。


indeed :) feel free to edit - Gab
1
这是错误的,你不能以这种方式修改listOfLists结构!你正在遍历一个空结构,所以for将不会执行任何操作,接下来的get将抛出异常。 - Jean-Baptiste Yunès
嗨,我看到你在括号内指定了大小,这是外部ArrayList的大小。我应该怎么做才能指定外部ArrayList中每个内部ArrayList的大小? - tonyabracadabra
在初始化for循环中。 - Gab
当你在Java中声明一个变量时,即使在实例化时指定了实现,也应该使用接口来声明它。@Gab我不确定我理解了这个。为什么要这样做?这难道不会限制你只能调用接口中包含的那些方法吗?这还会强制进行显式类型转换,以便使用实现类提供的其他方法。所以我想了解一下你为什么建议这样做。 - Ayush
显示剩余2条评论

3
ArrayList<String>[][] list = new ArrayList[10][10];
list[0][0] = new ArrayList<>();
list[0][0].add("test");

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接