recorrer example entre ejemplo diferencia java map case-insensitive

example - recorrer hashmap java



¿Hay una buena manera de tener un Map<String,?> Get y poner ignorando el caso? (8)

¿Sería posible implementar su propio mapa reemplazando métodos put / get?

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

Este enfoque no lo obliga a cambiar su tipo de "clave" sino su implementación de Mapa.

Esta pregunta ya tiene una respuesta aquí:

¿Hay una buena manera de tener un Map<String, ?> Get y poner ignorando el caso?


Las tres soluciones obvias que vienen a la mente:

  • Normalice el caso antes de usar un String como clave (no el idioma local turco funciona de manera diferente al resto del mundo).

  • Use un tipo de objeto especial diseñado para ser utilizado como clave. Esta es una expresión común para tratar con claves compuestas.

  • Utilice un TreeMap con un Comparador que no distingue entre mayúsculas y minúsculas (posiblemente una fuerza PRIMARIA o SECUNDARIA java.text.Collator). Desafortunadamente, la biblioteca Java no tiene un equivalente de Comparador para hashCode / equals.


Necesita una clase contenedora para su clave String con una implementación de igual a mayúsculas y minúsculas () y hashCode (). Úselo en lugar de la Cadena para la clave del Mapa.

Ver una implementación de ejemplo en http://www.java.happycodings.com/Java_Util_Package/code3.html Lo encontré en 2 minutos de googlear. Me parece sensato, aunque nunca lo he usado.


Podrías usar mi CaseInsensitiveMap licencia Apache discutido here . A diferencia de la versión de Apache Commons, conserva el caso de las claves. Implementa el contrato de mapa más estrictamente que TreeMap (además tiene una mejor semántica simultánea) (ver los comentarios del blog para más detalles).



TreeMap extiende Map y admite comparadores personalizados.

String proporciona un comparador insensible a mayúsculas / minúsculas predeterminado.

Asi que:

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

El comparador no tiene en cuenta la configuración regional. Lea más sobre esto en su JavaDoc.


Verifique la respuesta aceptada en el siguiente enlace. ¿Cómo verificar la clave en un Mapa independientemente del caso?

La conclusión es que "la solución más simple es simplemente convertir todas las entradas a mayúsculas (o minúsculas) antes de insertar / verificar. Incluso podría escribir su propio contenedor de mapas que haría esto para garantizar la consistencia".


Trove4j puede usar hashing personalizado para un HashMap. Sin embargo, esto puede tener implicaciones en el rendimiento dado que los códigos hash no pueden almacenarse en caché (¿aunque Trove4j puede haber encontrado una forma de evitar esto?). Los objetos Wrapper (como los describe John M) no tienen esta deficiencia de almacenamiento en caché. También vea mi otra respuesta con respecto a TreeMap.