72

我真的需要自己实现吗?

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

6 回答 6

138

创建一个包含您要删除的元素范围的子列表,然后调用返回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
于 2009-07-26T13:57:47.920 回答
8

或者,您可以使用subList方法:

public static <T> List<T> shrinkTo(List<T> list, int newSize) {
    return list.subList(0, newSize - 1);
}
于 2009-07-26T13:59:20.947 回答
6

使用ArrayList#removeRange()方法:

受保护的无效删除范围(int fromIndex,int toIndex)

从此列表中删除索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。将任何后续元素向左移动(减少它们的索引)。此调用通过 (toIndex - fromIndex) 元素缩短列表。(如果toIndex==fromIndex,则此操作无效。)

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

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

于 2009-07-26T13:51:43.140 回答
3

我的解决方案:

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);
于 2015-07-26T10:25:33.793 回答
1

还有另一个考虑。您可能希望避免ArrayList在方法签名中使用 a,而是使用List接口,因为它将您与ArrayList实现联系在一起,如果您发现 aLinkedList更适合您的需求,则很难进行后续更改. 防止这种紧密耦合确实是有代价的。

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

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

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

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 的这篇最喜欢的文章

于 2009-07-26T13:52:07.367 回答
0

我用了:

if (list.size() > newSize) {
    list = list.subList(0, newSize);
}
于 2022-02-16T12:44:19.283 回答