将ArrayList缩小为新大小

时间:2009-07-26 13:47:02

标签: java arraylist

我真的需要自己实施吗?

private void shrinkListTo(ArrayList<Result> list, int newSize) {
  for (int i = list.size() - 1; i >= newSize; --i)
  list.remove(i);
}

5 个答案:

答案 0 :(得分:108)

创建一个sublist,其中包含您要删除的元素范围,然后在返回的列表中调用clear

list.subList(23, 45).clear()

这种方法在ListArrayList的文档中被称为习语。


这是一个经过完全单元测试的代码示例!

// limit yourHappyList to ten items
int k = yourHappyList.size();
if ( k > 10 )
    yourHappyList.subList(10, k).clear();
    // sic k, not k-1

答案 1 :(得分:7)

或者您可以使用subList方法:

public static <T> List<T> shrinkTo(List<T> list, int newSize) {
    return list.subList(0, newSize - 1);
}

答案 2 :(得分:5)

使用ArrayList#removeRange()方法:

  

protected void removeRange(int fromIndex,                              int toIndex)

     

从此列表中删除索引介于fromIndex(包含)和toIndex(独占)之间的所有元素。将任何后续元素向左移动(降低其索引)。此调用通过(toIndex - fromIndex)元素缩短列表。 (如果toIndex == fromIndex,此操作无效。)

然后使用ArrayList#trimToSize()方法:

  

将此ArrayList实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储。

答案 3 :(得分:3)

我的解决方案:

shrinkTo(yourList, 6);

只需使用:

{{1}}

答案 4 :(得分:1)

还有另一个考虑因素。您可能希望避免在方法签名中使用ArrayList,而是使用List界面,因为它会将您绑定到ArrayList实施,从而难以进行更改例如,如果您发现LinkedList更适合您的需求。防止这种紧密耦合需要付出代价。

另一种方法可能如下所示:

private void shrinkListTo(List<Result> list, int newSize) {
  list.retainAll(list.subList(0, newSize);
}

不幸的是,List.retainAll()方法对于要实现的子类是可选的,因此您需要catch UnsupportedOperationException,然后执行其他操作。

private void shrinkListTo(List<Result> list, int newSize) {
  try {
    list.retainAll(list.subList(0, newSize);
  } catch (UnspportedOperationException e) {
     //perhaps log that your using your catch block's version.
     for (int i = list.size() - 1; i >= newSize; --i)
        list.remove(i);
     }
  }
}

这不像你的原始那么直截了当。如果您没有绑定到传入的List实例,则可以通过调用subList(int start, int end)轻松返回新实例,甚至不需要创建方法。这也是一个更快的实现,因为(在Java 6中),您将获得包含列表,偏移量和大小的AbstractList.SubList实例。不需要迭代。

如果您对编码接口而不是类的参数感兴趣,请参阅this favorite article by Allen Holub