【Java】Listを指定した数に分割する方法の紹介

スポンサーリンク

今回は、「java.util.List」を指定した数のリストへ分割する方法を紹介していきます。ここでは、次の方法についての実装例や使用例を紹介していきます。

  1. ライブラリを使用しない。
  2. Google Guavaライブラリを使用する。
  3. Apache Commons Collectionsライブラリを使用する。
スポンサーリンク

検証環境

検証に使用した環境/ライブラリを次に記載します。

  • Java
    • バージョン:11
  • Google Guava
    • バージョン:30.1-jre
  • Apache Commons Collections
    • バージョン:4.4

ライブラリを使用しない実装例

Google GuavaApache Commons Collectionsなどのライブラリを使用しないで、リスト分割を実施します。ライブラリを使用しない実装例は、次のようになります。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionUtils {
  public static <T> List<List<T>> partion(List<T> list, int size) {
    if (null == list || list.isEmpty() || size <= 0) {
      return Collections.emptyList();
    }
    int block = (list.size() + (size - 1)) / size;
    List<List<T>> partions = new ArrayList<List<T>>(block);
    for (int i = 0; i < block; i++) {
      int start = i * size;
      int end = Math.min(start + size, list.size());
      partions.add(list.subList(start, end));
    }
    return partions;
  }
}

if (null == list || list.isEmpty() || size <= 0)」は、入力値の確認を実施しています。リスト分割することができない場合は、空リストを返却するようにしています。

int block = (list.size() + (size - 1)) / size」は、リスト分割するためのサイズ計算を実施しています。計算式の意味については、次の計算例を確認してみてください。

【計算例1】

次の条件では、リストを3つに分割する動作になります。

  • 条件
    • リストサイズ:10
    • 分割サイズ:4
  • 計算結果
    • (10 + 4 - 1) / 4 = 3.25 = 3(小数点は切り捨てになります)

【計算例2】

次の条件では、リストを2つに分割する動作になります。

  • 条件
    • リストサイズ:10
    • 分割サイズ:5
  • 計算結果
    • (10 + 5 - 1) / 5 = 2.8 = 2(小数点以下は切り捨てになります)

計算式の意味については、「(a + (b - 1)) / b 切り上げ」のキーワードで検索してみてください。

for (int i = 0; i < block; i++)」は、リスト分割をサイズ計算した回数の処理を繰り返して、リスト分割処理を実施しています。

int start = i * sizeint start = i * size」は、リスト分割するための先頭位置の計算を実施しています。

int end = Math.min(start + size, list.size())」は、リスト分割するための末尾位置の計算を実施しています。「Math.min」は、指定したどちらかの小さい値を取得するための関数です。リストのサイズを超えた末尾位置にならないようにするために使用します。

list.subList(start, end)」は、リストの先頭と末尾を指定して切り出す処理を実施しています。

Google Guavaライブラリの使用例

Google Guavaライブラリを使用してリスト分割を実施します。ライブラリの使用例は、次のようになります。

List<List<String>> partions = com.google.common.collect.Lists.partition(
  Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"), 4);
for (List<String> partion : partions) {
  System.out.println(partion);
}

com.google.common.collect.Lists.partitionを使用してリスト分割を実施することができます。

  • 1番目の引数は、リスト分割の対象をしています。
    • 例では、リストサイズは「10」になります。
  • 2番目の引数は、リスト分割数を指定します。
    • 例では、「4」を指定しています。

実行結果は、次のようになります。

[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10]

リストサイズが「10」、リスト分割数が「4」のため、リストが3つに分割されていることを確認することができます。

Apache Commons Collectionsライブラリの使用例

Apache Commons Collectionsライブラリを使用してリスト分割を実施します。ライブラリの使用例は、次のようになります。

List<List<String>> partions = org.apache.commons.collections4.ListUtils.partition(
  Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"), 4);
for (List<String> partion : partions) {
  System.out.println(partion);
}

org.apache.commons.collections4.ListUtils.partitionを使用してリスト分割を実施することができます。

  • 1番目の引数は、リスト分割の対象をしています。
    • 例では、リストサイズは「10」になります。
  • 2番目の引数は、リスト分割数を指定します。
    • 例では、「4」を指定しています。

実行結果は、次のようになります。

[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10]

リストサイズが「10」、リスト分割数が「4」のため、リストが3つに分割されていることを確認することができます。

まとめ

今回は、ライブラリを使用しない場合と使用する場合のリストの分割方法を紹介しました。