Ответ 1
Вы пробовали
ConcurrentMap<String, Object> map =
new ConcurrentSkipListMap<String, Object>(
String.CASE_INSENSITIVE_ORDER);
Как я могу реализовать
class CaseInsensitiveConcurrentMap<V> implements ConcurrentMap<String , V>
который работает так же, как ConcurrentHashMap<String , V>
, за исключением того, что ключи сравниваются без учета регистра? Ключи не должны быть преобразованы в строчные или прописные.
Обратите внимание, что Collections.synchronizedMap(new TreeMap<String, new MyCaseInsensitiveComparator())
не является решением, так как он не позволяет concurrency и пропускает дополнительные методы.
Создание String-подобного класса с нечувствительностью к регистру equals
и hashCode
тоже не является параметром, так как карта должна быть передана методам, ожидающим строки как ключи.
Вы пробовали
ConcurrentMap<String, Object> map =
new ConcurrentSkipListMap<String, Object>(
String.CASE_INSENSITIVE_ORDER);
Если вы действительно настаиваете на всех своих ограничениях (ConcurrentHashMap) и строковых ключах:
Перезаписать любой метод ConcurrentHashMap и преобразовать любой ключ с ключом = key.toLowerCase().
Похоже на большую работу и много модульного тестирования, поэтому, если бы я был вами, я бы попытался обсудить интерфейс.
Пример:
@Overwrite
public void V get(String key) {
return super.get(transform(key));
}
// Extracted that to avoid cluttering your whole code with that specific transformation
// So you can easily change it
private String transform(String key) {
return key.toLowerCase();
}
Ужасно, но, учитывая ваши ограничения, выполнимо.