【问题标题】:Copying the first half of an ArrayList复制 ArrayList 的前半部分
【发布时间】:2014-02-05 20:32:15
【问题描述】:

有一个ArrayList<Integer> al,我想将它的前半部分元素复制到另一个ArrayList<Integer> 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));
 }

【问题讨论】:

  • 考虑使用subList
  • @SotiriosDelimanolis 注意:subList() 返回原始列表的“视图”,而不是副本。所以你需要firstHalf = new ArrayList(al.subList(0, newSize));

标签: java arraylist


【解决方案1】:

List#subList正好适合这个目的。

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

有两种情况需要考虑:

  • 偶数:如果大小是偶数,则 n / 2 是正确的分块大小。
  • 奇数:如果大小为奇数,则需要在结果中加 1 才能使奇数列表具有中间值。

【讨论】:

  • 你确定最后一句话吗?给出“from”和“to”索引时的约定是“to”索引是独占。 (更重要的是,Javadoc 说它是专有的。)
  • 好收获。不太确定我在想什么。在该值的末尾添加 1 应该可以纠正这一点。
  • 现在你打破了包含偶数个元素的列表。剧透:((al.size() + 1) / 2) - 1,如果你必须聪明地使用模运算,而不仅仅是添加if
  • 又抓到我了。希望已经解决了。
  • @howAnAngel_Dies_ 查看我在问题下的评论。只需使用new ArrayList(al.sublist(…)); 进行复制。
【解决方案2】:

您应该使用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

【讨论】:

【解决方案3】:

另一种方法:

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

【讨论】:

    【解决方案4】:
    List<Integer> firstHalf = al.subList(0, (int) al.size() / 2 + 1);
    

    将 al.size() / 2 转换为整数比执行 "%2" 更容易。

    你将 1 加到 firstHalf 以大于后半部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2020-09-21
      相关资源
      最近更新 更多