UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】リストを指定の数で分割したい

最大で1,000要素になる可能性があるリストで、もし800要素以上ある場合は800要素以下のリストと残りの要素のリストに分けたい

これはJavaでどうするんだっけ?と思ったので調べた

List.subList を使う

List.subListというのがあったので、普通にこれを使うのが良さそう

https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#subList-int-int-

List<E> subList(int fromIndex, int toIndex)

指定されたfromIndexからtoIndexまでの部分のビューを返す

fromIndexとtoIndexが等しい場合は、空のリストが返される

    public static <T> List<List<T>> splitList(List<T> list, int maxSize) {
        List<List<T>> splittedLists = new ArrayList<>();

        // 元のリストが800要素以上の場合に分割
        if (list.size() > maxSize) {
            splittedLists.add(list.subList(0, maxSize));
            splittedLists.add(list.subList(maxSize, list.size()));
        } else {
            // 元のリストが800要素以下の場合、そのまま返す
            splittedLists.add(list);
            splittedLists.add(new ArrayList<>());
        }

        return splittedLists;
    }

Arrays.copyOfRangeを使う

Listを配列に変換しArrays.copyOfRangeを使うこともできそう

docs.oracle.com

    public static <T> List<List<T>> splitList(List<T> list, int maxSize) {
        List<List<T>> splittedLists = new ArrayList<>();

        // リストを配列に変換
        T[] array = (T[]) list.toArray();

        // 元のリストが800要素以上の場合に分割
        if (array.length > maxSize) {
            T[] firstArray = Arrays.copyOfRange(array, 0, maxSize);
            T[] secondArray = Arrays.copyOfRange(array, maxSize, array.length);

            // 配列をリストに戻す
            splittedLists.add(Arrays.asList(firstArray));
            splittedLists.add(Arrays.asList(secondArray));
        } else {
            // 元のリストが800要素以下の場合、そのまま返す
            splittedLists.add(list);
            splittedLists.add(new ArrayList<>());
        }

        return splittedLists;
    }