web-dev-qa-db-ja.com

キーのリストに基づいてマップをフィルタリングする

私は次のような地図を持っています:

_class Person {

    Long personId;
    String name;

    /*Getters and Setters*/
}
_

マップにデータを入力しましたMap<Long, Person> personMap = new HashMap<>();

マップのキーはpersonId自体です。私はそのようなpersonIdsのリストを持っています、

List<Long> coolPeople = new ArrayList<>();

ここで、マップを反復処理して、リストcoolPeopleのIDに対応するキーを持つすべての値を取得し、それをリストに格納します。

Java 8でこれを最適に達成するにはどうすればよいですか?

6
user7950856

Listでのキーによる検索には予想されるO(1)時間がかかり、Mapでの検索にはO(n)最悪の場合の時間。

List<Person> people = 
    coolPeople.stream()
              .map(id -> personMap.get(id)) // or map(personMap::get)
              .filter(Objects::nonNull)
              .collect(Collectors.toList());
9
Eran

別の解決策(そしておそらくより効率的-マップ/リストのサイズによっては)は、マップをコピーしてkeySetに直接作用することです。

Map<Long, Person> copy = new HashMap<> (personMap);
copy.keySet().retainAll(coolPeople);

Collection<Person> result = copy.values();
4
assylias

これを修正してください:

List<Long> coolPeople = new ArrayList();

そして他の部分のために:

List<Person> coolPersons=new ArrayList<Person>();
for (Long id:coolPeople) {
     Person p=map.get(id);
     coolPersons.add(p);
}

ご不明な点がございましたら、お気軽にコメントしてください。

0
LMD

マップを返すことに興味がある場合は、次を使用できます。

public static <K, V> Map<K, V> filterByKeys(final Map<K, V> map, final Iterable<K> keys) {
    final Map<K, V> newMap = new HashMap<>();
    keys.forEach(key -> Optional.ofNullable(map.get(key))
            .ifPresent(value -> newMap.put(key, value)));
    return newMap;
}
0
Adam Morawski