当前位置: 首页 > 知识库问答 >
问题:

是否有一个通用的Java实用程序可以将列表分为多个批次?

甘兴学
2023-03-14

我给自己写了一个实用程序来将列表分成给定大小的批次。我只是想知道是否已经有任何apache公共资源用于此。

public static <T> List<List<T>> getBatches(List<T> collection,int batchSize){
    int i = 0;
    List<List<T>> batches = new ArrayList<List<T>>();
    while(i<collection.size()){
        int nextInc = Math.min(collection.size()-i,batchSize);
        List<T> batch = collection.subList(i,i+nextInc);
        batches.add(batch);
        i = i + nextInc;
    }

    return batches;
}

请让我知道是否有任何现有的实用程序已经相同。

共有3个答案

齐琦
2023-03-14

使用Apache Commons ListUtils。隔断

org.apache.commons.collections4.ListUtils.partition(final List<T> list, final int size)
孟智志
2023-03-14

如果您想生成Java-8批次流,可以尝试以下代码

public static <T> Stream<List<T>> batches(List<T> source, int length) {
    if (length <= 0)
        throw new IllegalArgumentException("length = " + length);
    int size = source.size();
    if (size <= 0)
        return Stream.empty();
    int fullChunks = (size - 1) / length;
    return IntStream.range(0, fullChunks + 1).mapToObj(
        n -> source.subList(n * length, n == fullChunks ? size : (n + 1) * length));
}

public static void main(String[] args) {
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);

    System.out.println("By 3:");
    batches(list, 3).forEach(System.out::println);
    
    System.out.println("By 4:");
    batches(list, 4).forEach(System.out::println);
}

输出:

By 3:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10, 11, 12]
[13, 14]
By 4:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
[13, 14]
孙朝明
2023-03-14

查看Lists.partition(java.util.List, int)从谷歌番石榴:

返回列表的连续子列表,每个子列表的大小相同(最终列表可能更小)。例如,将一个包含a、b、c、d、e的列表分区为3,会产生一个包含三个元素和两个元素的两个内部列表的外部列表,所有元素都按原始顺序排列。

 类似资料:
  • 问题内容: 我为自己编写了一个实用程序,用于将列表分成给定大小的批次。我只是想知道是否已经有针对此的apache commons util。 请让我知道是否已经有相同的现有实用程序。 问题答案: 看看: 返回列表的连续子列表,每个子列表大小相同(最终列表可能更小)。例如,对包含分区大小为3 的列表进行分区将产生-一个外部列表,包含两个由三个和两个元素组成的内部列表,所有列表均按原始顺序排列。

  • 问题内容: 想法是在片中具有可变数量的通道,将通过通道接收的每个值推入单个通道,并在最后一个输入通道关闭后关闭该输出通道。这样的事情,但对于多个渠道来说,要超过两个: 上面的代码避免了繁忙的循环,因为没有任何情况,这是很好的(编辑:看起来,“,ok”的存在使select语句成为非阻塞状态,并且循环毕竟是繁忙的。但是出于示例的目的,就好像将代码阻止一样)。是否可以通过任意数量的输入通道来实现相同的功

  • 我尝试用以下方法调用三个引用游标参数: 但是listOfObjects只包含cursor1的内容,无法获得cursor2的内容。

  • 问题内容: 我知道您可以设置一个具有实用程序样式 “ Stage.InitStyle(StageStyle.UTILITY);”的舞台。并且您可以将其设置为具有 透明样式“ Stage.InitStyle(StageStyle.TRANSPARENT);” 但是你们 两个可以在同一阶段吗?我很累,所以舞台不会 在开始菜单中显示为向下的窗口,我希望舞台不可见, 以便您只能看到场景。 问题答案: 您始

  • 问题内容: 在Java中将列表拆分为两个子列表的最简单,最标准和/或最有效的方法是什么?可以更改原始列表,因此无需复制。方法签名可以是 [EDIT] 返回原始列表上的视图,如果修改了原始视图,该视图将无效。因此,除非它也放弃了原始参考文献,否则无法使用(或者,如Marc Novakowski的回答所述,使用但立即复制结果)。 问题答案: 快速半伪代码: 它使用标准的List实现方法,并避免了所有循

  • 我有一个具有多个列的 spark 数据帧,其中一个指标列数据类型为字符串格式。此列数据如下所示,我需要将其转换为多个列。我尝试使用火花rdd映射函数,它显示了一个类型值错误。 架构:列1, 列 2, 度量字符串 示例数据: