Respaldar apropiadamente un mapa insensible a mayúsculas y minúsculas

Quiero implementar un mapa de hash sin distinción entre mayúsculas y minúsculas. Esta pregunta en sí misma no es nueva, pero quería agregar una funcionalidad adicional y no sé qué dirección general tomar. Quiero que el cliente pueda hacer algo como esto:

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()]

Puedo manejar la mayoría de esto bastante bien; Simplemente mantengo unaHashMap en el backend. Cuando un cliente pone algo, escribo en mayúscula la clave antes de agregarla al mapa.

Solo me cuesta escribir lakeySet() yentrySet() métodos. Quiero que el conjunto de entradas devueltas y el conjunto de claves estén respaldados por el mapa, como es el estándar con los mapas de Java.

in embargo, la única forma en que puedo pensar en manejar esto es crear una segunda estructura de datos de respaldo, algo así como unpreserved_case_map, que contiene lainput.toUpperCase() => entrada como pares de valores clave. Cuando el cliente llama a laentrySet() (okeySet()), Puedo construir el conjunto de entrada devuelto recorriendo elpreserved_case_map. El problema aquí es que el conjunto de entradas devuelto no se modificará si realizo cambios enHashMap, a menos que esté malinterpretando algo ...

Avíseme si esto tiene sentido, o si estoy complicando una situación simple.

Respuestas a la pregunta(12)

Su respuesta a la pregunta