Java - リストを2つのリストに分割する

1つのリストを2つのリストに分割する方法を紹介します。

1. for文で2つのリストに分割

forステートメントで、好きなサイズにリストを2つのリストに分けることができます。

以下の例では、半分に分けました。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Example {

    public static void main(String[] args) {

        List<String> myList = new ArrayList<>(
                Arrays.asList("A", "B", "C", "D", "E", "F", "G"));

        List<String> first = new ArrayList();
        List<String> second = new ArrayList();

        int size = myList.size();
        for (int i = 0; i < size; i++) {
            if (i < (size + 1)/2) {
                first.add(myList.get(i));
            } else {
                second.add(myList.get(i));
            }
        }

        System.out.println(first);
        System.out.println(second);
    }
}

Output:

[A, B, C, D]
[E, F, G]

2. subList() で 2 つのリストに分割

subList(fromIndex, toIndex) は fromIndex から toIndex までの要素を含む新しいリストを作成して返します。 toIndex はリストに含まれず、直前のインデックスである toIndex - 1 までのみ含まれます。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Example1 {

    public static void main(String[] args) {

        List<String> myList = new ArrayList<>(
                Arrays.asList("A", "B", "C", "D", "E", "F", "G"));

        int size = myList.size();
        List<String> first = myList.subList(0, (size + 1) / 2);
        List<String> second = myList.subList((size + 1) / 2, size);

        System.out.println(first);
        System.out.println(second);
    }
}

Output:

[A, B, C, D]
[E, F, G]

3. StreamとsubList()で2つのリストに分割

上記の subList() 例と同じですが、Stream を使用して以下のように実装することもできます。

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

public class Example2 {

    public static void main(String[] args) {

        List<String> myList = new ArrayList<>(
                Arrays.asList("A", "B", "C", "D", "E", "F", "G"));

        int[] endpoints = {0, (myList.size() + 1)/2, myList.size()};
        List<List<String>> lists =
                IntStream.rangeClosed(0, 1)
                        .mapToObj(i -> myList.subList(endpoints[i], endpoints[i + 1]))
                        .collect(Collectors.toList());

        List<String> first = lists.get(0);
        List<String> second = lists.get(1);
        System.out.println(first);
        System.out.println(second);
    }
}

Output:

[A, B, C, D]
[E, F, G]
codechachaCopyright ©2019 codechacha