Java - 特定の条件でHashMapをフィルタリングする

HashMapの要素のうち、特定の条件を満たす要素のみをフィルタリングする方法を紹介します。

1. for文を利用した方法

繰り返しステートメントを使用して、HashMapのすべての要素を巡回しながら、特定の条件を満たす要素のみを新しいMapに追加してフィルタリングできます。

import java.util.*;

public class Example {

    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(-2, "a1");
        map.put(-1, "a2");
        map.put(-0, "b1");
        map.put(1, "b2");
        map.put(2, "c1");

        Map<Integer, String> filtered = new HashMap<>();
        for (Map.Entry<Integer, String> entry: map.entrySet()) {
            if (entry.getKey() >= 0) {
                filtered.put(entry.getKey(), entry.getValue());
            }
        }

        System.out.println(filtered);
    }
}

Output:

{0=b1, 1=b2, 2=c1}

もし value の条件でフィルタリングをしたいときは、以下のように Entry の value に対して条件式を実装すればよい。

Map<Integer, String> filtered = new HashMap<>();
for (Map.Entry<Integer, String> entry: map.entrySet()) {
    if (entry.getValue().startsWith("b")) {
        filtered.put(entry.getKey(), entry.getValue());
    }
}

System.out.println(filtered);

Output:

{0=b1, 1=b2}

2. Streamを利用した方法

HashMap.entrySet() は要素を Entry の Set として返します。

エントリのストリームを作成し、 filter() を使用して、特定の条件を満たす要素のみを新しいマップに追加できます。

import java.util.*;
import java.util.stream.Collectors;

public class Example1 {

    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(-2, "a1");
        map.put(-1, "a2");
        map.put(-0, "b1");
        map.put(1, "b2");
        map.put(2, "c1");

        Map<Integer, String> filtered = map.entrySet().stream()
                .filter(entry -> entry.getKey() >= 0)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

        System.out.println(filtered);
    }
}

Output:

{0=b1, 1=b2, 2=c1}

もしvalueの条件でフィルタリングをしたいなら、以下のようにvalueの条件式を実装すればよい。

Map<Integer, String> filtered = map.entrySet().stream()
        .filter(entry -> entry.getValue().startsWith("b"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

System.out.println(filtered);

Output:

{0=b1, 1=b2}
codechachaCopyright ©2019 codechacha