Я пытаюсь добиться максимальной производительности для своего приложения. В какой-то момент кода я хочу получить все значения с карты, кроме той, которая соответствует определенному ключу.
Теперь, если бы я хотел получить все значения, я бы использовал это:
map.values();
и полагая, что класс TreeMap создан эффективно, метод "values ()" просто возвращает refference so → O (1).
В моем случае, хотя я хочу исключить значение определенного ключа. Этот код:
Set<String> set = new ...
for (String key: map.keySet()) {
if (!key.equals("badKey")) {
set.add(map.get(key));
}
}
имеет сложность N * (logN), которая намного медленнее начального O (1), и это вызвано необходимостью удаления только одного значения.
Есть лучший способ сделать это?
Вы можете использовать entrySet
вместо keySet
. Таким образом, O (1) потребовалось бы выяснить, принадлежит ли данное значение ключу, который вы хотите исключить.
Вы можете вызвать entrySet
любое время, когда вам нужно перебирать значения, и исключить "плохую" клавишу во время итерации по ним. Это даст вам такую же сложность, как и итерация над values()
Collection.
Как насчет этого?
map.entrySet().stream()
.filter(e -> !e.getKey().equals(keyToFilter))
.map(Map.Entry::getValue);
Завершите с помощью forEach
или toCollection(Collectors.TO_SET)
или просто верните поток.
Извините, если код не компилируется точно, он из памяти, и я не коснулся API-интерфейсов java 8 через несколько месяцев, но вы должны получить дрейф. ;)
Вы можете создать набор из map.values()
и после удаления значения "badKey" из этого набора.
Set<String> set = new HashSet<String>(map.values());
String badValue = map.get("badKey");
set.remove(badValue);