web-dev-qa-db-ja.com

マップにリスト/反復可能オブジェクトのキーが含まれているかどうかを見つける効率的な方法

マップにリストのキーが含まれているかどうかを確認し、含まれている場合は最初に一致する値を返す必要があります。頭に浮かぶ素朴なアプローチは、2つのネストされたループで行うことです。

Map<String, String> fields = new HashMap<String, String>();
fields.put("a", "value a");
fields.put("z", "value z");
String[] candidates = "a|b|c|d".split("|");
for (String key : fields.keySet()){
    for (String candidate : candidates) {
        if (key.equals(candidate)){
            return fields.get(key);
        }
    }
}

Java標準ライブラリに依存している可能性があるより良い、より効率的な方法はありますか?

15
ccpizza

確かに次のようなもの:

for (String candidate : candidates) {
     String result = fields.get(key);
     if (result != null) {
         return result;
     }
}

上記は候補キーごとにoneマップ検索のみを実行します。存在しないキーを抽出するとnullが得られるだけなので、プレゼンスと抽出の個別のテストは行われません。 (Slanecに感謝)有効なキーのnull値は、このソリューションでは存在しないキーと区別できないことに注意してください。

ところで、なぜ大文字小文字変換を実行しているのかよくわかりません。

22
Brian Agnew
for(String candidate : candidates) {
 if(fields.containsKey(candidate)) {
  return fields.get(candidate)
 }
}

null値がマップに含まれている可能性があり、最初に検出されたキーのみが必要な場合の最良の方法。

24
NimChimpsky

私の見解:

Map<String, String> fields = new HashMap<String, String>();
fields.put("a", "value a");
fields.put("z", "value z");
String[] candidates = "a|b|c|d".split("|");
for (String candidate : candidates) {
    if (fields.containsKey(candidate)) {
        return fields.get(candidate);
    }
}
7
Petr Janeček

Java 8では、これを使用できます:

return candidates.stream()
            .filter(fields::containsKey)
            .findFirst()
            .map(fields::get)
            .orElse(null);
6
Klapsa2503

Java 8では、これを持つことができます:

boolean exists = Arrays.stream(candidates).anyMatch(fields::containsKey);

候補のいずれかがマップのキーであるかどうかを知りたいだけの場合。

あなたが最初のものまたはあなたが使うことができるものを知りたいなら:

Arrays.stream(candidates).filter(fields::containsKey).findAny();

または

Arrays.stream(candidates).filter(fields::containsKey).findFirst();

上記の@ Klapsa2503回答に従って

6
mrossini

試す

Set<String> keySet = new HashSet<String>(fields.keySet());    
keySet.retainAll(list);

したがって、keySetには、リストに記載されているHashMapのすべてのキーが含まれているはずです。

5

として試してください

    List list= Arrays.asList(1, 2, 3);
    HashMap map = new HashMap();
    map.put(1, 1);
    map.put(3, 3);
    Set set = new HashSet(map.keySet());
    set.retainAll(list);
    System.out.println(set);
    Object e = set.isEmpty() ? null : set.iterator().next();
    System.out.println(e);

出力

[1, 3]
1
2
Map<String, String> fields = new HashMap<String, String>();
fields.put("a", "value a");
fields.put("z", "value z");
String[] candidates = "a|b|c|d".split("|");
List<String> canList = Arrays.asList(candidates );
for (String key : fields.keySet()){

if (canList .contains(key)) {
return fields.get(key);
}

}
1
NPKR

検索値が小文字であると想定するのと同じように、マップのキーがすでに小文字であると想定している場合は、単一のループを使用できます。

1
Peter Lawrey