【问题标题】:How can use stream API for divide the array into sub array如何使用流 API 将数组划分为子数组
【发布时间】:2019-04-11 06:20:20
【问题描述】:

我有一个大小为 1000 的数组。 我想使用流操作来执行这样的操作:-

List list= new ArrayList();
//list is initialize to 1000 elements 

  List subList = list.subList(0, 100);
   // perform some operaions over the subarray
  List subList1 = list.subList(101, 200);
   // perform some operaions over the subarray
 .... so on
}

我想要使用流 API 的代码。 提前致谢

【问题讨论】:

  • 您还记得那个列表以索引0 开头,对吧?
  • 所以范围是 0-99、100-199 等等,对吧?
  • @SharonBenAsher 您可能希望将两个问题合并到一条评论中。现在看起来很傻。 (将我的评论标记为删除,以便在完成后将其删除)。
  • 是的@SharonBenAsher 实际上对于第一个子列表,元素的数量将从 0 到 100,即 101 个元素
  • .subList(0, 100) 只有 100 个元素。而.subList(101, 200) 将有 99 个元素。

标签: java list java-8 java-stream


【解决方案1】:

怎么样:

  List<List<Integer>> result = IntStream.range(0, list.size() / 100)
         .mapToObj(index -> list.subList(index * 100, index * 100 + 100))
         .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    你可以使用Collectors.partitioningBy:

    Map<Boolean, List<Integer>> map = list.stream().collect(Collectors.partitioningBy(element -> list.indexOf(element) >= 100));
    and then do:  
    List<List<Integer>> results = new ArrayList(map.values());
    

    更新: Collectors.partitioningBy 采用谓词,因此无法解决所需的用例。

    或者,如果您想将列表分成相等的部分(我认为更多的是您的用例),您可以使用Collectors.groupingBy()

    Map<Integer, List<Integer>> groups = 
          list.stream().collect(Collectors.groupingBy(element -> (element - 1) / YOUR_NUMBER_OF_PIECES_PER_SUBLIST));
        List<List<Integer>> subLists= new ArrayList<List<Integer>>(groups.values());
    System.out.println("Number of sublists " + subLists.size());
    

    这给了你:

    Number of sublists: 5
    

    当使用NUMBER_OF_PIECES_PER_SUBLIST = 200 运行时,这似乎是您的用例。

    【讨论】:

    • @ltFreak 我不确定 partitioningBy 是否适合我的情况,因为 partitioningBy 的用例是根据提供的谓词将列表分为两部分。
    • @HasnainAliBohra 你是对的,我扩展了我的答案
    【解决方案3】:

    您可以使用IntStream.iterate() 来实现:

    int sublistItems = 100;
    List<List<Integer>> result = IntStream.iterate(0, i -> i + sublistItems)
            .limit((list.size() + sublistItems - 1) / sublistItems)
            .mapToObj(startIndex -> list.subList(startIndex, Math.min(startIndex + sublistItems, list.size())))
            .collect(Collectors.toList());
    

    如果您使用的是 Java 9 或更高版本,则可以这样简化:

    int sublistItems = 100;
    List<List<Integer>> result = IntStream.iterate(0, i -> i < list.size(), i -> i + sublistItems)
            .mapToObj(startIndex -> list.subList(startIndex, Math.min(startIndex + sublistItems, list.size())))
            .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2023-03-17
      • 2017-05-24
      • 2013-04-27
      相关资源
      最近更新 更多