复制ArrayList的前半部分

有一个ArrayList al ,我想将其前半部分元素复制到另一个ArrayList firstHalf 。 (如果al有一个奇数个元素, firstHalf应该还有一个元素。)但是,下面的代码抛出一个IndexOutOfBoundsException ,并说Index: 0, Size: 0 ,虽然我不确定这是怎么回事,因为ArrayLists的索引从0开始。另外,我知道.arraycopy ,但我想这样做,使用for循环。

  int x = al.size()/2 + (al.size()%2) - 1; for(int i = 0; i < x; i++){ firstHalf.set(i, al.get(i)); } 

你应该使用add而不是set

 int x = al.size()/2 + (al.size()%2) - 1; for(int i = 0; i < x; i++){ firstHalf.add(al.get(i)); } 

最好使用List#subList

List#subList非常适合此目的。

 int chunkSize = al.size() % 2 == 0 ? al.size() / 2 : (al.size() / 2) + 1; List firstHalf = al.subList(0, chunkSize); 

有两种情况需要考虑:

  • 偶数 :如果大小是偶数,则n / 2是块大小的正确大小。
  • 奇数 :如果大小是奇数,那么你需要在奇数长度列表的结果中加1,以得到中间值。

另一种方法:

 List firstHalf = al.subList(0, al.size()/2 + (al.size()%2) - 1); 
 List firstHalf = al.subList(0, (int) al.size() / 2 + 1); 

更容易将al.size()/ 2转换为整数而不是“%2”。

你将firstHalf加1比下半部分大。