Можно ли HashMap
вернуть значение по умолчанию для всех ключей, которые не найдены в наборе?
java
dictionary
hashmap
Ларри
источник
источник
getOrDefault()
ссылкиОтветы:
[Обновить]
Как отмечают другие ответы и комментаторы, начиная с Java 8 вы можете просто позвонить
Map#getOrDefault(...)
.[Оригинал]
Нет реализации Map, которая делает это точно, но было бы тривиально реализовать свою собственную, расширяя HashMap:
источник
(v == null)
на,(v == null && !this.containsKey(k))
если они намеренно добавилиnull
значение. Я знаю, это всего лишь угловой случай, но автор может столкнуться с этим.!this.containsValue(null)
. Это немного отличается от!this.containsKey(k)
.containsValue
Решение потерпит неудачу , если некоторые другие ключ был явно присвоено значениеnull
. Например:map = new HashMap(); map.put(k1, null); V v = map.get(k2);
в этом случаеv
все равно будетnull
, правильно?В Java 8 используйте Map.getOrDefault . Он принимает ключ и значение, которое возвращается, если не найдено ни одного соответствующего ключа.
источник
getOrDefault
это очень хорошо, но требует определения по умолчанию каждый раз, когда к карте обращаются. Однократное определение значения по умолчанию также будет иметь преимущества для удобства чтения при создании статической карты значений.private static String get(Map map, String s) { return map.getOrDefault(s, "Error"); }
Используйте DefonstedMap Commons, если вы не хотите изобретать велосипед, например,
Вы также можете передать существующую карту, если вы не отвечаете за ее создание.
источник
Java 8 представила хороший метод по умолчанию computeIfAbsent для
Map
интерфейса, который хранит ленивые значения и не нарушает контракт карты:Происхождение: http://blog.javabien.net/2014/02/20/loadingcache-in-java-8-without-guava/
Отказ от ответственности: этот ответ не соответствует точно заданному OP, но может быть полезен в некоторых случаях, когда заголовок вопроса совпадает, когда число ключей ограничено и кэширование различных значений будет выгодным. Он не должен использоваться в противоположном случае с большим количеством ключей и тем же значением по умолчанию, так как это приведет к ненужной трате памяти.
источник
Разве вы не можете просто создать статический метод, который делает именно это?
источник
Вы можете просто создать новый класс, который наследует HashMap, и добавить метод getDefault. Вот пример кода:
Я думаю, что вам не следует переопределять метод get (K key) в вашей реализации из-за причин, указанных Эдом Стаубом в его комментарии, и из-за того, что вы нарушите контракт интерфейса Map (это может привести к некоторому трудному для поиска ошибок).
источник
get
метод. С другой стороны - ваше решение не позволяет использовать класс через интерфейс, что часто может иметь место.Использование:
источник
Это делает это по умолчанию. Это возвращается
null
.источник
HashMap
только для этой функциональности, когдаnull
все в порядке.NullObject
шаблон или не хотите разбрасывать нулевые проверки по всему коду - желание, которое я полностью понимаю.На яве 8+
источник
Я нашел LazyMap весьма полезным.
Это позволяет вам сделать что-то вроде этого:
Вызов
get
создает значение по умолчанию для данного ключа. Вы указываете, как создать значение по умолчанию с заводским аргументом вLazyMap.lazyMap(map, factory)
. В приведенном выше примере карта инициализируется как новаяAtomicInteger
со значением 0.источник
List<String>
- использование принятого ответа, я рискну использовать один и тот же список для каждого нового ключа, а не, скажем, anew ArrayList<String>()
с завода.Не напрямую, но вы можете расширить класс, чтобы изменить его метод get. Вот готовый к использованию пример: http://www.java2s.com/Code/Java/Collections-Data-Structure/ExtendedVersionofjavautilHashMapthatprovidesanextendedgetmethodaccpetingadefaultvalueue.htm
источник
Пример использования:
источник
Мне нужно было прочитать результаты, полученные с сервера в JSON, где я не мог гарантировать наличие полей. Я использую класс org.json.simple.JSONObject, который является производным от HashMap. Вот некоторые вспомогательные функции, которые я использовал:
источник
В смешанных проектах Java / Kotlin также рассмотрите Kotlin's Map.withDefault .
источник