Не с обычными картами.
«abc» — это отдельная строка от «ABC», их хэш-коды различны, а их методы equals() возвращают false по отношению друг к другу.
Самое простое решение - просто преобразовать все входные данные в верхний (или нижний) регистр перед вставкой/проверкой. Вы даже можете написать свою собственную оболочку Map
, которая сделает это для обеспечения согласованности.
Если вы хотите сохранить регистр ключа, как указано, но с нечувствительным к регистру сравнением, вы можете изучить использование TreeMap и предоставить свой собственный компаратор, который будет сравнивать без учета регистра. Однако хорошенько подумайте, прежде чем пойти по этому пути, так как вы будете сталкиваться с непримиримыми несоответствиями: если кто-то назовет map.put("abc", 1)
, а затем map.put("ABC", 2)
, в каком регистре хранится ключ в карте? Можете ли вы даже сделать это имеет смысл? Вас устраивает тот факт, что если кто-то обернет вашу карту в стандарт, например. HashMap
вы потеряете функциональность? Или что, если кто-то все равно перебирает ваш набор ключей и выполняет свою быструю проверку «содержит» с помощью equals()
, вы получите противоречивые результаты? Таких случаев тоже будет много. Обратите внимание, что вы нарушаете контракт Map, делая это (поскольку равенство ключей определяется в терминах метода equals() для ключей), так что это действительно не работает ни в каком смысле.
Соблюдение строгой карты в верхнем регистре намного проще в работе и обслуживании, и имеет то преимущество, что фактически является легальной реализацией карты.
22.06.2010
TreeMap
и да - помнить о проблемах с нарушением контракта. (IIRC, вызовremove/retainAll
с определенными классами коллекций может дать неожиданные результаты.) Еще лучше, по возможности, использоватьImmutableSortedMap/Set
Guava, что позволяет избежать непоследовательного поведения при использовании пользовательского компаратора. 28.12.2015