我真的需要自己实现吗?
private void shrinkListTo(ArrayList<Result> list, int newSize) {
for (int i = list.size() - 1; i >= newSize; --i)
list.remove(i);
}
或者,您可以使用subList方法:
public static <T> List<T> shrinkTo(List<T> list, int newSize) {
return list.subList(0, newSize - 1);
}
受保护的无效删除范围(int fromIndex,int toIndex)
从此列表中删除索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。将任何后续元素向左移动(减少它们的索引)。此调用通过 (toIndex - fromIndex) 元素缩短列表。(如果toIndex==fromIndex,则此操作无效。)
然后使用ArrayList#trimToSize()方法:
将此 ArrayList 实例的容量修剪为列表的当前大小。应用程序可以使用此操作来最小化 ArrayList 实例的存储。
我的解决方案:
public static void shrinkTo(List list, int newSize) {
int size = list.size();
if (newSize >= size) return;
for (int i = newSize; i < size; i++) {
list.remove(list.size() - 1);
}
}
只需使用:
shrinkTo(yourList, 6);
还有另一个考虑。您可能希望避免ArrayList
在方法签名中使用 a,而是使用List
接口,因为它将您与ArrayList
实现联系在一起,如果您发现 aLinkedList
更适合您的需求,则很难进行后续更改. 防止这种紧密耦合确实是有代价的。
另一种方法可能如下所示:
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
包含您的列表、其中的偏移量和大小的实例。没有必要进行迭代。
如果您对编码为接口而不是类的参数感兴趣,请参阅Allen Holub 的这篇最喜欢的文章
我用了:
if (list.size() > newSize) {
list = list.subList(0, newSize);
}