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

Sam*_*Sam 115 java collections

什么方法截断列表 - 例如前100个元素 - 丢弃其他元素(不迭代单个元素)?

Ben*_*ngs 133

用途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 );
  }
}
Run Code Online (Sandbox Code Playgroud)

您应该记住subList返回项目的视图,因此如果您希望列表的其余部分符合垃圾回收的条件,您应该将所需的项目复制到新项目中List:

List<String> subItems = new ArrayList<String>(items.subList(0, 2));
Run Code Online (Sandbox Code Playgroud)

如果列表短于指定的大小,则期望超出范围的异常.选择所需大小的最小值和列表的当前大小作为结束索引.

最后,请注意第二个参数应该比最后一个所需的索引多一个.

  • 虽然问题不太清楚,但听起来萨姆确实希望删除列表的末尾。因此你的答案应该包含一个list.clear()。 (2认同)

kar*_*m79 51

list.subList(100, list.size()).clear();
Run Code Online (Sandbox Code Playgroud)

要么:

list.subList(0, 100);
Run Code Online (Sandbox Code Playgroud)

  • 还要注意`subList(100,list.size()).clear()`只有在list实现了clear方法时才有效,例如你用`List <String>创建`list` list = Arrays.asList( someString.split(","));`clear()将抛出`UnsupportedOperationException`,因为`list`将是一个抽象的`List`. (3认同)
  • 第一个选项修改列表,而第二个选项不修改列表.它应该是`list = list.subList(0,100)` (2认同)
  • 遗憾的是你必须创建一个对象只是为了缩短列表 (2认同)

Ous*_* D. 5

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
Run Code Online (Sandbox Code Playgroud)