Apoiar apropriadamente um mapa que não diferencia maiúsculas de minúsculas

Eu quero implementar um mapa de hash sem distinção entre maiúsculas e minúsculas. Essa pergunta por si só não é nova, mas eu queria adicionar funcionalidades extras e não sei que direção geral tomar. Eu quero que o cliente seja capaz de fazer algo assim:

boolean preserve_case = true;
Map<String, MyClass> maplet = new CaseInsensitiveHashMap<MyClass>(preserve_case); // If the client enters true at construction, then the put, get, and remove methods should still be case insensitive, but the entry and key sets should preserve the case that the client used when calling put.

maplet.put("FoO", my_class);

MyClass bar = maplet.get("foo"); // Should return a reference to my_class

Set<Entry<String, MyClass>> case_sensitive_set = maplet.entrySet(); // Since the client input true to preserve order, this entry set should be ["FoO"=my_class.toString()]

Eu posso lidar muito bem com isso; Eu simplesmente mantenho umHashMap no back-end. Quando um cliente coloca alguma coisa, coloco a chave em maiúscula antes de adicioná-la ao map

Estou tendo dificuldade para escrever okeySet() eentrySet() métodos. Desejo que o conjunto de entradas retornado e o conjunto de chaves sejam apoiados pelo mapa, como é o padrão nos mapas Jav

No entanto, a única maneira de pensar em lidar com isso é criar uma segunda estrutura de dados de backup, algo como umpreserved_case_map, que contém oinput.toUpperCase() => entrada como pares de valores-chave. Quando o cliente chama peloentrySet() (oukeySet()), Eu posso construir a entrada retornada definida através dopreserved_case_map. O problema aqui é que o conjunto de entradas retornado não será modificado se eu fizer alterações noHashMap, a menos que eu esteja entendendo algo errado ...

Deixe-me saber se isso faz sentido ou se estou complicando uma situação simple

questionAnswers(12)

yourAnswerToTheQuestion