Существует ли хороший способ иметь Карту <Строка?> получают и помещают игнорирующий регистр? [дубликат]

61
задан Daniel Trebbien 30 June 2012 в 19:05
поделиться

7 ответов

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

String предоставляет компаратор без учета регистра по умолчанию.

Итак:

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

Компаратор не принимает во внимание языковой стандарт. Подробнее об этом читайте в JavaDoc.

62
ответ дан 24 November 2019 в 17:06
поделиться

Вы могли использовать CaseInsensitiveMap от Наборов палаты общин Apache.

42
ответ дан Eric Weilnau 24 November 2019 в 17:06
поделиться

Было бы возможно реализовать Ваше собственное переопределение Карты, помещал/получал методы?

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

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

Этот подход не вынуждает Вас изменить свой "ключевой" тип, но свою Реализацию Map.

31
ответ дан Yishai 24 November 2019 в 17:06
поделиться

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

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

14
ответ дан John M 24 November 2019 в 17:06
поделиться

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

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

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

  • Использование TreeMap с Компаратором, который нечувствителен к регистру (возможно ОСНОВНАЯ или ВТОРИЧНАЯ сила java.text. Сортировально-подборочная машина). К сожалению, библиотека Java не имеет Компаратора эквивалентным для хэш-кода/равняться.

3
ответ дан Tom Hawtin - tackline 24 November 2019 в 17:06
поделиться

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

3
ответ дан 24 November 2019 в 17:06
поделиться

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

0
ответ дан 24 November 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: