Moyen efficace pour trouver si la carte contient des clés à partir d'une liste/itérable
J'ai besoin de vérifier si la carte contient des clés à partir d'une liste, et si c'est le cas alors de retour de la première valeur correspondante. L'approche naïve qui vient à l'esprit est de le faire en deux boucles imbriquées:
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);
}
}
}
Est-il plus agréable et plus efficace, peut-être en se basant sur la norme Java bibliothèque?
Vous devez vous connecter pour publier un commentaire.
Sûrement quelque chose comme:
Ci-dessus n'effectue un carte recherche par clé candidate. Il évite de le séparer de test pour la présence de plus d'extraction, depuis l'extraction d'une inexistant clé de tout simplement vous donner une valeur null. Remarque (merci Slanec) qu'une valeur null pour une clé valide est indiscernable d'un non-existant clé de cette solution.
Je ne comprends pas très bien pourquoi vous êtes d'effectuer la conversion de la casse, btw.
null
est d'une valeur autorisée dans leMap
.map.get()
une fois au lieu demap.contains() + map.get()
parce que cela permettrait d'éviter une deuxième recherche? Ce qui est propre!null
.null
de valeurs et d'optimiser les performances (j'espère qu'après une vérification avec un profileur de), vous pouvez la vaincre par l'insertion d'un objet factice au lieu denull
s. De cette façon, vous pouvez toujours faire une seule recherche et sinull
est retourné, vous saurez que la clé n'était pas là. Si votre objet factice est retourné, vous serez de retournull
.null
clés dans une carte. Avez-vous eu une vraie vie de cas d'utilisation pournull
clés?la meilleure façon, si les valeurs null sont peut-être à la carte, et si seul le premier détecté clé est nécessaire.
De mon point de vue:
Dans Java 8, vous pouvez utiliser ceci:
Dans Java 8, vous pouvez avoir ceci:
Si vous voulez simplement savoir si l'un des candidats est la clé de la carte.
Si vous voulez savoir la première ou de tout vous pouvez utiliser:
ou
Comme par @Klapsa2503 réponse ci-dessus
Essayer
donc
keySet
est censé avoir toutes les clés de HashMap qui sont mentionnés dans la listeEssayer
sortie
Vous pouvez utiliser une seule boucle si vous assumez la clé de la carte sont déjà en minuscules, de la même manière, vous assumez la recherche de valeurs sont en minuscules.