【问题标题】:Truncate a list to a given number of elements将列表截断为给定数量的元素
【发布时间】:2010-11-19 18:02:15
【问题描述】:

什么方法会截断列表(例如前 100 个元素)而丢弃其他列表(不遍历单个元素)?

【问题讨论】:

    标签: java collections


    【解决方案1】:

    使用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。选择所需大小的最小值和列表的当前大小作为结束索引。

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

    【讨论】:

    • 虽然问题并不完全清楚,但听起来 sam 确实希望删除列表的末尾。因此,您的答案应该包括 list.clear()。
    • 这不太可能表现得像 karim79 的解决方案那样好,这是最好的替代方案 - 它最有可能表现良好并且也是最干净的代码。
    • 我认为这取决于要删除的元素数量(以及列表是否支持修改)
    • 如果 Java 8 是一个选项,我认为 Stream.limit 应该可以解决问题 (docs.oracle.com/javase/8/docs/api/java/util/stream/…)
    【解决方案2】:
    list.subList(100, list.size()).clear();
    

    或:

    list.subList(0, 100);
    

    【讨论】:

    • 第一个选项修改列表,而第二个不修改。应该是list = list.subList(0, 100)
    • 另外请注意,subList(100, list.size()).clear() 仅在 list 实现其 clear 方法时才有效,例如,如果您通过 List&lt;String&gt; list = Arrays.asList(someString.split(",")); 创建 list,clear() 将抛出 UnsupportedOperationException,因为 list 将做个抽象的List.
    • 如果要保留List的前n个元素,应该是list.subList(n, list.size()).clear();
    • 耻辱你必须创建一个对象只是为了缩短一个列表
    • @DavidBradley 是的,但 HotSpot 实际上可能会优化它
    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多