Когда вы итерацию над Map
, если вам нужен ключ и значение, что лучше перебрать entrySet
, а не keySet
.
public static String getKeyFromValue(String value) {
for (Map.Entry<String, List<String>> e : Server.entrySet()) {
if (e.getValue().contains(value)) {
return e.getKey();
}
}
return null;
}
Это должно работать, но есть 3 вещи, которые мне не нравятся об этом (кроме Server
, начиная с прописной буквы).
contains
для многих List
реализаций (включая ArrayList
и LinkedList
) медленно, потому что это линейный поиск. Вместо этого лучше использовать HashSet
.
- Если
value
встречается в нескольких списках на карте, возвращаемый ключ может быть любым из нескольких ответов. Может быть лучше, чтобы имя метода указывало это (например, getAnyKeyForValue
).
- Может быть предпочтительнее вернуть
Optional<String>
, а не использовать null
, чтобы это значение не было найдено.
Java, 8 решение, принимая все эти пункты во внимание и пользуясь параллельности бы
public static Optional<String> getAnyKeyForValue(String value) {
return Server.entrySet()
.parallelStream()
.filter(e->e.getValue().contains(value))
.map(Map.Entry::getKey)
.findAny();
}
Итак, если я правильно понял, вы хотите вернуть список, хранящийся под определенным ключом? Или что вы пытаетесь выполнить? – Zaheylu