【问题标题】:Split List into List of List [duplicate]将列表拆分为列表列表[重复]
【发布时间】:2018-05-26 08:06:53
【问题描述】:

假设我有一个List<Object>,其中包含 100 个对象。使用 Java 8(没有任何 tierce 库)获得包含 10 个 List 的 10 个 ObjectList<List<Object>> 的最佳方法是什么?

【问题讨论】:

  • @birryree 回复之前可以看一下帖子吗,提到Java8
  • @Moussi 仅仅因为它提到了 Java 8 并不意味着非 Java8 的特定答案不适用。
  • @birryree 使用经典 java 你可以做任何事情,但海报正在寻找 java8 解决方案。
  • 解决方案取决于您要如何拆分该列表。你想通过一些共同的属性分组他们吗?或者可能基于他们在列表中的位置?

标签: java


【解决方案1】:

您需要一个外部 final 计数器,但这似乎可行。

    // Must be final (or implicitly final). 
    AtomicInteger n = new AtomicInteger();
    Map<String, List<Integer>> groups = IntStream.range(0, 100)
            .boxed()
            .collect(Collectors.groupingBy(
                    // Group by n / 10.
                    o -> String.valueOf(n.getAndIncrement() / 10)
                    )
            );

【讨论】:

  • 您可以使用 PrimitiveIterator.OfInt 来避免 AtomicInteger。
  • @richardstartin - 不错!谢谢,我没有遇到PrimitiveIterator
【解决方案2】:

我将首先获取卡盘大小(在您的情况下为 10 个元素),然后查看列表并使用 subList 从中取出块。例如:

List<List<Object>> subLists = IntStream
    .range(0, (int) Math.ceil((double) list.size() / subListSize))
    .mapToObj(i -> new ArrayList<>
                       (list.subList(i * subListSize, (i + 1) * subListSize)))
    .collect(Collectors.toList());

注意: 转换为 double 和上限是为了避免整数除法,以防 subListSize 不能完全除法 list.size()

【讨论】:

    【解决方案3】:

    使用番石榴更简单(你在帖子中提到without any tierce library我还是放了这个)

    @Test
    public void givenList_whenParitioningIntoNSublists_thenCorrect() {
        List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
        List<List<Integer>> subSets = Lists.partition(intList, 3);
    
        List<Integer> lastPartition = subSets.get(2);
        List<Integer> expectedLastPartition = Lists.<Integer> newArrayList(7, 8);
        assertThat(subSets.size(), equalTo(3));
        assertThat(lastPartition, equalTo(expectedLastPartition));
    }
    

    【讨论】:

      【解决方案4】:

      在 java 9 中,您可以使用 takeWhile 生成带有 IntStream 的索引,然后使用这些索引从原始列表中获取子列表。 这应该适用于任何对象列表

      private static final int BATCH_SIZE = 10;
      
      public void test(){
          List<List<Object>> batchedLists = split(generateTestObjects());
      }
      
      public List<List<Object>> split(List<Object> objects) {
          return IntStream.iterate(0, n -> n + BATCH_SIZE)
                  .takeWhile(n -> n < objects.size())
                  .map(t -> objects.subList(t, Math.min(t + BATCH_SIZE, objects.size()))
                  .collect(Collectors.toList());
      }
      
      public List<Object> generateTestObjects(){
          return IntStream.range(0, 100)
                  .boxed()
                  .collect(Collectors.toList());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 2018-12-08
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多