Есть ли хороший способ получить карту & lt; String,? & Gt; получить и поставить игнорирование дела?

Есть ли хороший способ получить и выложить Map без учета дела?

вопрос задан 17.10.2008
Joshua
14383 репутация

8 ответов


  • 61 рейтинг

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

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

    Итак:

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

    Компаратор не учитывает локаль. Узнайте больше об этом в его JavaDoc.

    ответ дан volley, с репутацией 5599, 9.12.2009
  • 42 рейтинг

    Вы можете использовать CaseInsensitiveMap из Apache's Commons Collections.

    ответ дан Eric Weilnau, с репутацией 3252, 17.10.2008
  • 31 рейтинг

    Можно ли было бы реализовать свои собственные методы put / get с переопределением Map?

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

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

    ответ дан Guido García, с репутацией 24124, 17.10.2008
  • 14 рейтинг

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

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

    ответ дан John M, с репутацией 10736, 17.10.2008
  • 3 рейтинг

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

    ответ дан Glyn Normington, с репутацией 938, 30.04.2009
  • 3 рейтинг

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

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

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

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

    ответ дан Tom Hawtin - tackline, с репутацией 123417, 17.10.2008
  • 0 рейтинг

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

    ответ дан volley, с репутацией 5599, 9.12.2009
  • 0 рейтинг

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

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

    ответ дан Kunjan, с репутацией 1, 29.03.2013