Java でリストをチャンクに分割する

Sheeraz Gul 2023年10月12日
  1. List.subList() メソッドを使用して、Java でリストをチャンクに分割する
  2. Collectors.groupingBy() メソッドを使用して、Java でリストをチャンクに分割する
  3. Java で Apache Commons Collections メソッドを使用してリストをチャンクに分割する
  4. Java で Google Guava ライブラリを使用してリストをチャンクに分割する
Java でリストをチャンクに分割する

Java では、リストを特定のサイズのチャンクに分割する必要がある場合があります。 Java でこれを実現するためのさまざまな機能があります。

このチュートリアルでは、Java でリストをチャンクに分割するさまざまな方法を示します。

List.subList() メソッドを使用して、Java でリストをチャンクに分割する

List.subList メソッドを for ループと共に使用して、Java でリストを特定のサイズのチャンクに分割できます。 subList() メソッドは、特定の開始インデックスと終了インデックス内の指定されたリストからサブリストを取得します。

例を見てみましょう:

package delftstack;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
  public static void main(String[] args) {
    List<Integer> DemoList = IntStream.rangeClosed(100, 120).boxed().collect(Collectors.toList());
    int ChunckSize = 3;

    List<List<Integer>> Chunks = new ArrayList<>();

    for (int x = 0; x < DemoList.size(); x += ChunckSize) {
      Chunks.add(DemoList.subList(x, Math.min(x + ChunckSize, DemoList.size())));
    }

    System.out.println(Chunks);
  }
}

上記のコードは、指定されたリストからサイズ 3 のチャンクを作成します。 出力を参照してください。

リストチャンク出力

同様に、Java 9 IntStream.iterate() を使用して、Java でリストをチャンクに分割できます。 例を参照してください。

package delftstack;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
  private static <T> List<List<T>> Chunks(List<T> DemoList, int ChunkSize) {
    return IntStream.iterate(0, x -> x < DemoList.size(), x -> x + ChunkSize)
        .mapToObj(x -> DemoList.subList(x, Math.min(x + ChunkSize, DemoList.size())))
        .collect(Collectors.toList());
  }

  public static void main(String[] args) {
    List<Integer> DemoList = IntStream.rangeClosed(100, 120).boxed().collect(Collectors.toList());
    int ChunkSize = 3;

    List<List<Integer>> Chunks = Chunks(DemoList, ChunkSize);
    System.out.println(Chunks);
  }
}

上記のコードは、Java 9 の IntStream.iterate() を使用して、最初の例と同じ操作を実行します。 出力を参照してください。

リストチャンク出力

Java 8 Stream API を使用して同じ操作を実行することもできます。 例を参照してください:

package delftstack;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
  private static <T> List<List<T>> Chunk(List<T> DemoList, int ChunkSize) {
    return IntStream.rangeClosed(0, (DemoList.size() - 1) / ChunkSize)
        .mapToObj(
            x -> DemoList.subList(x * ChunkSize, Math.min((x + 1) * ChunkSize, DemoList.size())))
        .collect(Collectors.toList());
  }

  public static void main(String[] args) {
    List<Integer> DemoList = IntStream.rangeClosed(100, 120).boxed().collect(Collectors.toList());
    int ChunkSize = 3;

    List<List<Integer>> Chunks = Chunk(DemoList, ChunkSize);
    System.out.println(Chunks);
  }
}

上記のコードは、Java 8 Stream API を使用して、リストを 3つのチャンクに分割します。 出力を参照してください。

リストチャンク出力

Collectors.groupingBy() メソッドを使用して、Java でリストをチャンクに分割する

Java Stream API の Collectors.groupingBy() メソッドを使用して、リストをチャンクに分割することもできます。ここでは、リスト要素ごとにグループ化してチャンクを作成します。 このメソッドは、マップの形式でチャンクを返します。

例を見てみましょう:

package delftstack;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
  private static <T> Collection<List<T>> Chunk(List<T> DemoList, int GroupBy) {
    return IntStream.range(0, DemoList.size())
        .boxed()
        .collect(Collectors.groupingBy(
            x -> x / GroupBy, Collectors.mapping(DemoList::get, Collectors.toList())))
        .values();
  }

  public static void main(String[] args) {
    List<Integer> DemoList = IntStream.rangeClosed(100, 120).boxed().collect(Collectors.toList());
    int ChunkSize = 3;

    Collection<List<Integer>> Chunks = Chunk(DemoList, ChunkSize);
    System.out.println(Chunks);
  }
}

上記のコードは、グループ化機能を使用して、指定されたリストのチャンクを Java で作成します。 出力を参照してください。

リストチャンク出力

同様に、可変カウンターを使用して上記のコードを簡素化できます。 例を参照してください。

package delftstack;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
  private static <T> Collection<List<T>> Chunk(List<T> DemoList, int Groupby) {
    AtomicInteger counter = new AtomicInteger();
    return DemoList.stream()
        .collect(Collectors.groupingBy(it -> counter.getAndIncrement() / Groupby))
        .values();
  }

  public static void main(String[] args) {
    List<Integer> DemoList = IntStream.rangeClosed(100, 120).boxed().collect(Collectors.toList());
    int ChunkSize = 3;

    Collection<List<Integer>> Chunks = Chunk(DemoList, ChunkSize);
    System.out.println(Chunks);
  }
}

上記のコードは、変更可能なカウンター AtomicInteger を使用してリストでグループ化し、サイズ 3 のチャンクを作成します。 出力を参照してください。

リストチャンク出力

Java で Apache Commons Collections メソッドを使用してリストをチャンクに分割する

Apache Commons は、リストを含む多くの操作を提供するサードパーティ ライブラリです。 Apache Commons のコレクションを使用して、Java でリストのチャンクを作成することもできます。

まず、Apache Commons がビルド パスに追加されていることを確認します。 Apache Commons Collections を使用してリストのチャンクを作成する例を試してみましょう。

package delftstack;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.apache.commons.collections4.ListUtils;

public class Example {
  public static void main(String[] args) {
    List<Integer> DemoList = IntStream.rangeClosed(100, 120).boxed().collect(Collectors.toList());
    int ChunkSize = 3;

    List<List<Integer>> Chunks = ListUtils.Chunk(DemoList, ChunkSize);
    System.out.println(Chunks);
  }
}

Apache Commons は、指定されたリストのチャンクを作成するために使用される partition と呼ばれるメソッドを提供します。 出力を参照してください。

リストチャンク出力

Java で Google Guava ライブラリを使用してリストをチャンクに分割する

Google の Guava パッケージも、Java のリストに関する多くの機能を提供します。 Java でリストのチャンクを作成するために使用されるメソッド Lists.partition() を提供します。

Guava パッケージはサードパーティのパッケージであり、JDK には含まれていないため、ビルド パスに追加されていることを確認してください。 例を試してみましょう:

package delftstack;

import com.google.common.collect.Lists;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
  public static void main(String[] args) {
    List<Integer> DemoList = IntStream.rangeClosed(100, 120).boxed().collect(Collectors.toList());
    int ChunkSize = 3;

    List<List<Integer>> Chunk = Lists.partition(DemoList, ChunkSize);
    System.out.println(Chunk);
  }
}

上記のコードは、Guava ライブラリの partition() メソッドを使用して、指定されたリストのチャンクを 3つの形式で同様に作成します。 出力を参照してください。

リストチャンク出力

著者: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

関連記事 - Java List