我有ArrayList
个ArrayList
个。我将一个复制到另一个,除了以不同的顺序(元素旋转180°,但这并不重要)。
我有这个通用代码:
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 5; c++) {
list.get(r).set(c, "an element from the other list");
}
}
我随意使用尺寸4
表示行数,5
表示列数。
但是,这会引发索引超出范围错误,显然是因为我没有ArrayList<ArrayList<String>>
的维度。
我知道在创建ArrayList
,you can give it an initial capacity for a constructor parameter时。但是,我不知道如何应用它:
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
这不会编译,但这基本上就是我想要的:
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>(5)>(4);
为了在我尝试复制列表之前给矩阵一些维度,我只是迭代了我想要的行数,并添加了我想要每行的列数大小的列表。
我使用了一个常规数组并将其转换为ArrayList
只是为了使元素的默认值为null,因此会影响大小。
for (int r = 0; r < 4; r++) {
// list.add( new ArrayList<String>(5) ); // doesn't work
list.add( new ArrayList<String>( Arrays.asList(new String[5]) ) );
}
因此适用于设置大小,因为有足够的元素将被添加到矩阵中,但它不是首选的解决方案。
有没有办法在初始化期间设置ArrayList
ArrayList
的初始尺寸?或者只是迭代并添加null
值的其他东西?
答案 0 :(得分:2)
这对我有用:
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>(4);
for (int r = 0; r < 4; r++) {
ArrayList<String> ls = new ArrayList<String>(5);
ls.add("" + (r + 1));
list.add(ls);
}
for (ArrayList<String> ls : list) {
System.out.println(ls);
}
注意:不要将集合中当前元素数ArrayList#size()
与ArrayList#capacity
,当前最大集合(无法访问)混淆。
有关详细信息,请参阅:ArrayList(int)
:
构造一个具有指定初始容量的空列表。
请注意,使用List<List<Whatever>>
您并未创建2D动态数组,您需要创建一个包含动态列表的动态列表,因此必须初始化每个动态列表通过单独列出并将列表(从任何大小)添加到另一个列表中,每个列表都具有动态大小(尽管它们具有值)。除非您创建此类或从第三方库导入它,否则普通Java中没有2d动态数组和动态数组数组。
看起来这种结构更适合您的情况:
String[][] stringArrayOfArray = new String[4][5];
完成你想要/需要的另一个非常奇怪的方法(不推荐)是:
List<String>[] arrayOfList = new List[4];
for (int i = 0; i < arrayOfList.length; i++) {
arrayOfList[i] = new ArrayList<String>();
}