Есть ли хороший способ иметь карту <String,?> Получить и положить игнорировать случай?

Есть ли хороший способ получить Map<String, ?> get и put игнорировать случай?

Ответ 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

Проверьте принятый ответ по ссылке ниже. Как проверить ключ на карте, независимо от случая?

Нижняя строка: "Самое простое решение - просто преобразовать все входы в верхний регистр (или в нижний регистр) перед вставкой/проверкой. Вы даже можете написать свою собственную оболочку карты, которая сделает это, чтобы обеспечить согласованность".