18

マップにリストのキーが含まれているかどうかを確認し、含まれている場合は最初に一致する値を返す必要があります。頭に浮かぶ素朴なアプローチは、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標準ライブラリに依存する方法はありますか?

4

9 に答える 9

26
for(String candidate : candidates) {
 if(fields.containsKey(candidate)) {
  return fields.get(candidate)
 }
}

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

于 2012-12-28T11:04:34.870 に答える
24

確かに次のようなもの:

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

上記は、候補キーごとに1 つのマップ検索のみを実行します。存在しないキーを抽出すると単にnullが返されるため、存在と抽出の個別のテストを回避します。このソリューションでは、有効なキーの null 値は存在しないキーと区別できないことに注意してください ( Slanecに感謝します)。

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

于 2012-12-28T11:05:07.257 に答える
7

私の見解:

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);
    }
}
于 2012-12-28T11:04:45.957 に答える
7

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

return candidates.stream()
            .filter(fields::containsKey)
            .findFirst()
            .map(fields::get)
            .orElse(null);
于 2016-11-18T09:35:07.887 に答える
5

試す

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

リストに記載されているkeySetHashMap からのすべてのキーがあるはずです

于 2012-12-28T11:09:39.263 に答える
2

としてみてください

    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
于 2012-12-28T11:06:51.087 に答える
1
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);
}

}
于 2012-12-28T11:05:17.820 に答える
1

ルックアップ値が小文字であると仮定するのと同じように、マップのキーが既に小文字であると仮定する場合は、単一のループを使用できます。

于 2012-12-28T11:10:52.803 に答える