マップにリストのキーが含まれているかどうかを確認し、含まれている場合は最初に一致する値を返す必要があります。頭に浮かぶ素朴なアプローチは、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標準ライブラリに依存している可能性があるより良い、より効率的な方法はありますか?
確かに次のようなもの:
for (String candidate : candidates) {
String result = fields.get(key);
if (result != null) {
return result;
}
}
上記は候補キーごとにoneマップ検索のみを実行します。存在しないキーを抽出するとnullが得られるだけなので、プレゼンスと抽出の個別のテストは行われません。 (Slanecに感謝)有効なキーのnull値は、このソリューションでは存在しないキーと区別できないことに注意してください。
ところで、なぜ大文字小文字変換を実行しているのかよくわかりません。
for(String candidate : candidates) {
if(fields.containsKey(candidate)) {
return fields.get(candidate)
}
}
null値がマップに含まれている可能性があり、最初に検出されたキーのみが必要な場合の最良の方法。
私の見解:
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);
}
}
Java 8では、これを使用できます:
return candidates.stream()
.filter(fields::containsKey)
.findFirst()
.map(fields::get)
.orElse(null);
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回答に従って
試す
Set<String> keySet = new HashSet<String>(fields.keySet());
keySet.retainAll(list);
したがって、keySet
には、リストに記載されているHashMapのすべてのキーが含まれているはずです。
として試してください
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
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);
}
}
検索値が小文字であると想定するのと同じように、マップのキーがすでに小文字であると想定している場合は、単一のループを使用できます。