【发布时间】:2010-11-19 18:02:15
【问题描述】:
什么方法会截断列表(例如前 100 个元素)而丢弃其他列表(不遍历单个元素)?
【问题讨论】:
标签: java collections
什么方法会截断列表(例如前 100 个元素)而丢弃其他列表(不遍历单个元素)?
【问题讨论】:
标签: java collections
使用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));
如果列表短于指定大小,则预期超出范围exception。选择所需大小的最小值和列表的当前大小作为结束索引。
最后,请注意第二个参数应该比最后一个所需的索引大一。
【讨论】:
Stream.limit 应该可以解决问题 (docs.oracle.com/javase/8/docs/api/java/util/stream/…)
list.subList(100, list.size()).clear();
或:
list.subList(0, 100);
【讨论】:
list = list.subList(0, 100)
subList(100, list.size()).clear() 仅在 list 实现其 clear 方法时才有效,例如,如果您通过 List<String> list = Arrays.asList(someString.split(",")); 创建 list,clear() 将抛出 UnsupportedOperationException,因为 list 将做个抽象的List.
list.subList(n, list.size()).clear();
subList,正如其他答案中所建议的那样,是第一个想到的。我还建议stream approach。
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
【讨论】: