将数组列表缩小到新大小

我真的需要自己实现它吗?

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

使用 数组列表 # RemoveRange ()方法:

Protected void RemoveRange (int from Index, Int to Index)

从此列表中移除索引介于 from Index (包含)和 toIndex (排他)之间的所有元素。将后面的元素向左移动(减少它们的索引)。这个调用通过(toIndex-from Index)元素缩短列表。(如果 toIndex = = from Index,则此操作无效。)

然后使用 数组列表 # trimToSize ()方法:

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

还有一个考虑因素。您可能不想在方法签名中使用 ArrayList,而是使用 List接口,因为它将您与 ArrayList实现绑定在一起,如果您发现 LinkedList更适合您的需要,那么就很难进行更改。防止这种紧密耦合的确是要付出代价的。

另一种方法可能是这样的:

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)轻松返回一个新实例,甚至不需要创建方法。这也将是一个更快的实现,因为(在 Java6中) ,您将获得一个包含您的列表的 AbstractList.SubList实例,其中包含一个偏移量和一个大小。不需要迭代。

如果您对编码为 Interfaces 而不是类的参数感兴趣,请参阅 这是 Allen Holub 最喜欢的文章

创建一个包含要删除的元素范围的 子列表,然后在返回的列表上调用 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

或者你可以使用 子表格方法:

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

我的解决办法是:

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);

我用:

if (list.size() > newSize) {
list = list.subList(0, newSize);
}

这是我使用的 util 类。

public class ArrayUtil {
public static <T>ArrayList<T> reduceSize(ArrayList<T> models, int size){
int k = models.size();
if ( k > size )
models.subList(size, k).clear();
return models;
}
}

在你的主课上说

ArrayUtil.reduceSize(myArrayList, 10);