Есть ли хороший способ получить Map<String, ?>
get и put игнорировать случай?
Есть ли хороший способ иметь карту <String,?> Получить и положить игнорировать случай?
Ответ 1
TreeMap расширяет карту и поддерживает пользовательские компараторы.
String предоставляет нечувствительный к регистру случайный компаратор.
Итак:
final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
Компаратор не учитывает локаль. Подробнее об этом читайте в своем JavaDoc.
Ответ 2
Вы можете использовать CaseInsensitiveMap из коллекций Apache Commons.
Ответ 3
Можно ли реализовать собственные методы переопределения карт /get Map?
public class CaseInsensitiveMap extends HashMap<String, String> {
...
put(String key, String value) {
super.put(key.toLowerCase(), value);
}
get(String key) {
super.get(key.toLowercase());
}
}
Этот подход не заставляет вас изменять свой "ключ", но ваша реализация карты.
Ответ 4
Вам нужен класс-оболочка для вашего строкового ключа с реализацией без учета регистра equals() и hashCode(). Используйте это вместо клавиши String для карты.
См. пример реализации на http://www.java.happycodings.com/Java_Util_Package/code3.html Я нашел его в 2 минутах от поискового запроса. Мне кажется разумным, хотя я никогда не использовал его.
Ответ 5
Три очевидных решения, которые spring должны учитывать:
-
Нормализовать регистр перед использованием String в качестве ключа (не турецкий язык работает иначе, чем остальная часть мира).
-
Используйте специальный тип объекта, предназначенный для использования в качестве ключа. Это обычная идиома для работы с составными клавишами.
-
Использовать TreeMap с компаратором, который нечувствителен к регистру (возможно, синтаксис PRIMARY или SECONDARY java.text.Collator). К сожалению, в библиотеке Java нет эквивалента Comparator для hashCode/equals.
Ответ 6
Вы можете использовать мой Apache, лицензированный CaseInsensitiveMap, обсужденный здесь. В отличие от версии Apache Commons, она сохраняет случай с ключами. Он реализует контракт с картой более строго, чем TreeMap (плюс имеет лучшую параллельную семантику) (подробности см. В комментариях к блогу).
Ответ 7
Trove4j может использовать пользовательское хеширование для HashMap. Это может, однако, иметь последствия для производительности, учитывая, что хэш-коды не могут быть кэшированы (хотя Trove4j, возможно, нашел способ обойти это?). Объекты обертки (как описано Джоном М) не имеют этого дефицита кеширования. Также см. Мой другой ответ в отношении TreeMap.
Ответ 8
Проверьте принятый ответ по ссылке ниже. Как проверить ключ на карте, независимо от случая?
Нижняя строка: "Самое простое решение - просто преобразовать все входы в верхний регистр (или в нижний регистр) перед вставкой/проверкой. Вы даже можете написать свою собственную оболочку карты, которая сделает это, чтобы обеспечить согласованность".