我真的需要自己实施吗?
private void shrinkListTo(ArrayList<Result> list, int newSize) {
for (int i = list.size() - 1; i >= newSize; --i)
list.remove(i);
}
答案 0 :(得分:108)
创建一个sublist,其中包含您要删除的元素范围,然后在返回的列表中调用clear
。
list.subList(23, 45).clear()
这是一个经过完全单元测试的代码示例!
// 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)
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