Есть ли хороший способ получить и поставить Map<String, ?>, игнорируя регистр?[дубликат]

StackOverflow https://stackoverflow.com/questions/212562

  •  03-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Есть ли хороший способ иметь Map<String, ?> взять и поставить игнорируя регистр?

Это было полезно?

Решение

TreeMap расширяет Map и поддерживает пользовательские компараторы.

String предоставляет компаратор по умолчанию, нечувствительный к регистру.

Так:

final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

Компаратор не учитывает локаль.Подробнее об этом читайте в JavaDoc.

Другие советы

Вы могли бы использовать CaseInsensitivityMap из Коллекций общин Apache.

Можно ли реализовать собственную карту, переопределяющую методы put/get?

public class CaseInsensitiveMap extends HashMap<String, String> {
    ...
    put(String key, String value) {
       super.put(key.toLowerCase(), value);
    }

    get(String key) {
       super.get(key.toLowercase());
    }
}

Этот подход заставляет вас менять не тип «ключа», а реализацию вашей карты.

Вам нужен класс-оболочка для вашего ключа String с регистронезависимой реализацией методаquals() и hashCode().Используйте это вместо строки для ключа карты.

См. пример реализации на http://www.java.happycodings.com/Java_Util_Package/code3.html Я нашел это за 2 минуты поиска в Google.Мне кажется разумным, хотя я никогда им не пользовался.

Три очевидных решения, которые приходят на ум:

  • Нормализуйте регистр, прежде чем использовать строку в качестве ключа (не турецкий язык работает иначе, чем остальной мир).

  • Используйте специальный тип объекта, предназначенный для использования в качестве ключа.Это распространенная идиома для работы с составными ключами.

  • Используйте TreeMap с компаратором, нечувствительным к регистру (возможно, ПЕРВИЧНОЙ или ВТОРИЧНОЙ силы java.text.Collator).К сожалению, в библиотеке Java нет эквивалента Comparator для hashCode/equals.

Вы можете использовать мою лицензию Apache CaseInsensitivityMap обсуждено здесь.В отличие от версии Apache Commons, здесь сохраняется регистр ключей.Он реализует контракт карты более строго, чем TreeMap (плюс имеет лучшую параллельную семантику) (подробности см. в комментариях в блоге).

Трове4j может использовать собственное хеширование для HashMap.Однако это может повлиять на производительность, учитывая, что хеш-коды не могут быть кэшированы (хотя Trove4j, возможно, нашел способ обойти это?).Объекты-оболочки (как описано Джоном М.) не имеют этого недостатка кэширования.Также см. мой другой ответ относительно TreeMap.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top