将列表截断为给定数量的元素


120

有什么方法可以将列表截断(例如,截断前100个元素),而丢弃其他列表(而不迭代单个元素)?

Answers:


141

用途List.subList

import java.util.*;
import static java.lang.Math.min;

public class T {
  public static void main( String args[] ) {
    List<String> items = Arrays.asList("1");
    List<String> subItems = items.subList(0, min(items.size(), 2));

    // Output: [1]
    System.out.println( subItems );

    items = Arrays.asList("1", "2", "3");
    subItems = items.subList(0, min(items.size(), 2));

    // Output: [1, 2]
    System.out.println( subItems );
  }
}

您应该牢记subList返回项目的视图,因此,如果您希望列表的其余部分有资格进行垃圾回收,则应将想要的项目复制到新的项目List

List<String> subItems = new ArrayList<String>(items.subList(0, 2));

如果列表短于指定的大小,则应超出范围例外。选择所需大小的最小值和列表的当前大小作为结束索引。

最后,请注意,第二个参数应比上一个所需的索引大一个。


1
虽然问题还不清楚,但听起来确实像sam想要删除列表的末尾。因此,您的答案应包括list.clear()。
mP。

这可能不如karim79的解决方案执行得好,后者是最好的选择-它具有最佳执行的机会,并且也是最干净的代码。
劳伦斯·多尔

我认为这取决于要删除的元素的数量(以及列表是否支持修改)
Ben Lings

1
如果你的Java 8是一种选择,我觉得Stream.limit应该做的伎俩(docs.oracle.com/javase/8/docs/api/java/util/stream/...
伊兰棉兰

53
list.subList(100, list.size()).clear();

要么:

list.subList(0, 100);

3
第一个选项修改列表,而第二个没有修改。应该list = list.subList(0, 100)
-nessa.gp

3
还要注意,subList(100, list.size()).clear()仅当list实现了clear方法时,该方法才有效,例如,如果您list通过List<String> list = Arrays.asList(someString.split(","));clear()创建将抛出异常,UnsupportedOperationException因为list它将是abstract List
Gyuri

如果您想保留列表的前n个元素,应为list.subList(n, list.size()).clear();
Chaklader Asfak Arefe '18

1
可惜您必须创建一个对象只是为了缩短列表
David Bradley

1
@DavidBradley是的,但HotSpot可能实际上可以优化这一点
Stefan Reich

8

subList就像其他答案中所建议的那样,是第一个想到的。我还建议采用流式方法

source.stream().limit(10).collect(Collectors.toList()); // truncate to first 10 elements
source.stream().skip(2).limit(5).collect(Collectors.toList()); // discards the first 2 elements and takes the next 5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.