二维ArrayList

19

我知道我可以通过在数组旁边添加另一个 [] 来向数组添加维度。但是,我是否可以在 java.util.ArrayList 中拥有多个维度?我该如何实现这一点?


2维数组列表的副本 - zardosht
3个回答

25
List<ArrayList<Integer>> twoDArrayList = new ArrayList<ArrayList<Integer>>();

@rgettman的答案可以解决问题,但是需要注意以下几点:

注意事项1:数组维度

在最常见的用例中,数组的维度是预定义的,例如:

int[][] array = new int[5][6];

在这种情况下,数组将具有定义的维度的“矩形”形式:

  0 1 2 3 4 5
0 [][][][][][]
1 [][][][][][]
2 [][][][][][]
3 [][][][][][]
4 [][][][][][]  

如下方评论中的另一位成员建议的那样,这并不是全部。 "二维数组" 只是其他数组的数组,而上面的代码行只是简写形式:

int[][] array = new int[5][];
array[0] = new int[6];
array[1] = new int[6];
array[2] = new int[6];
array[3] = new int[6];
array[4] = new int[6];

或者,子数组可以使用不同的大小实例化,这种情况下,“数据形状”将不再是矩形:

int[][] array = new int[5][];
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];
array[3] = new int[6];
array[4] = new int[3];

  0 1 2 3 4 5
0 [][]        
1 [][][][]    
2 []          
3 [][][][][][]
4 [][][]

使用ArrayList<ArrayList<Integer>>方法将导致一个“列表的列表”,其中所有涉及的列表的长度将因执行的操作而增长。

没有预定义维度的简写。子列表必须插入到主列表中,然后必须将数据元素插入到子列表中。因此,数据的形状将类似于第二个示例:

0 [][]        <- list with 2 elements
1 [][][][]    <- list with 4 elements
2 []          ...and so on
3 [][][][][][]
4 [][][]

注意2:数据的默认值

数组允许使用原始数据类型(如“int”)以及它们的包装类(如“Integer”)。当涉及到元素的默认值时,它们会表现出不同的行为。

int[][] array1 = new int[5][6];         // all elements will default to 0
Integer[][] array2 = new Integer[5][6]; // all elements will default to null

列表(与所有其他集合一样)仅允许使用装箱类型。因此,虽然可以预定义列表的长度,但其元素的默认值始终为null。

List<Integer> = new ArrayList<Integer>(10); // all elements will default to null

使用List<List<Integer>>会导致错误,因此最好的方法是List<ArrayList<Integer>>。 - boctulus
@paulkore,如果我们有如上所示的二维ArrayList<>List<>,该如何迭代? - Paresh
4
值得注意的是,二维数组(如果逐行创建)可以是一个非矩形的“不规则”数组,就像您的列表示例一样。 - user4229245
@paulkore:用户4229245提到的是非常重要的事实!你只是陈述了错误的事情,让人们感到困惑。 - h345k34cr
@h345k34cr,感谢您指出这一点。我现在已经修改了答案,希望更好地反映了情况。我必须说,我认为您的评论过于苛刻了,因为我的意图是分享我当时最好的理解,而不是“说错话来混淆人们”。我希望您在未来的评论中选择更友好的方式。 - paulkore

24

可以的。只需将你的ArrayList元素也设为ArrayLists

ArrayList<ArrayList<Integer>> twoDArrayList = new ArrayList<ArrayList<Integer>>();

这不仅适用于 ArrayLists,还适用于其他集合类型。


0

可以的!在普通数组中,当您添加第二对大括号时,您正在创建一个存储类型为数组的对象的普通数组。您可以在这里做同样的事情,使ArrayList保存类型为ArrayList的内容:ArrayList<ArrayList<Object>> list = new ArrayList<ArrayList<Object>>();


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