Java - 2次元リスト平坦化(flatten)

リストを要素として持っているリスト、2次元リストを1次元リストに変更する方法を紹介します。平らにするという意味で平坦化とも呼ばれます。

1. for文で2次元リスト平坦化

次の例では、2次元リストを平坦化する flatten() 関数を実装しています。関数の中では for 文と addAll() で 2 次元リストを 1 次元リストに変換しています。

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

public class Example {

    public static void main(String[] args) {

        List<List<String>> myList = Arrays.asList(Arrays.asList("a", "b", "c"),
                Arrays.asList("d", "e", "f"),
                Arrays.asList("h", "i", "j"));

        List<String> flattenList = flatten(myList);

        System.out.println(flattenList);
    }

    public static List<String> flatten(List<List<String>> listOfLists) {
        List<String> result = new ArrayList<>();
        for (List<String> list : listOfLists) {
            result.addAll(list);
        }
        return result;
    }
}

Output:

[a, b, c, d, e, f, h, i, j]

2. forEach()で2次元リスト平坦化

forEach() を使ってすべてのリスト要素を巡回しながら addAll() で 1 次元リストにすべての要素を追加しながら平坦化することができます。

以下の例では、 forEach(flattenList::addAll)forEach(list -> flattenList.addAll(list)) と同じ意味になります。

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

public class Example1 {

    public static void main(String[] args) {

        List<List<String>> myList = Arrays.asList(Arrays.asList("a", "b", "c"),
                Arrays.asList("d", "e", "f"),
                Arrays.asList("h", "i", "j"));

        List<String> flattenList = new ArrayList<>();
        myList.forEach(flattenList::addAll);

        System.out.println(flattenList);
    }
}

Output:

[a, b, c, d, e, f, h, i, j]

3. Streamとreduce()で2次元リスト平坦化

Stream と reduce() で以下のように 2 次元リストを 1 次元リストを平坦化できます。

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

public class Example2 {

    public static void main(String[] args) {

        List<List<String>> myList = Arrays.asList(Arrays.asList("a", "b", "c"),
                Arrays.asList("d", "e", "f"),
                Arrays.asList("h", "i", "j"));

        List<String> flattenList = myList.stream().reduce(new ArrayList<>(), (x, y) -> {
            x.addAll(y);
            return x;
        });

        System.out.println(flattenList);
    }
}

Output:

[a, b, c, d, e, f, h, i, j]
codechachaCopyright ©2019 codechacha