¿Existe una buena forma de tener un mapa < String,? & Gt; obtener y poner caso ignorando? [duplicar]

StackOverflow https://stackoverflow.com/questions/212562

  •  03-07-2019
  •  | 
  •  

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

¿Hay una buena manera de tener un Map < String,? > get and put ignorando mayúsculas y minúsculas?

¿Fue útil?

Solución

TreeMap extiende Map y admite comparadores personalizados.

String proporciona un comparador de mayúsculas y minúsculas predeterminado.

Entonces:

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.

Otros consejos

Puede usar CaseInsensitiveMap de las colecciones de Apache's Commons.

¿Sería posible implementar sus propios métodos de poner / obtener que invaliden los mapas?

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 le obliga a cambiar su " clave " escriba pero su implementación de mapa.

Necesitas una clase envoltura para tu clave de cadena con una implementación equals-insensitive equals () y hashCode () Use eso en lugar de la Cadena para la clave del Mapa. ??

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

Las tres soluciones obvias que vienen a la mente:

  • Normalice el caso antes de usar una Cadena como clave (no la configuración regional turca funciona de manera diferente al resto del mundo).

  • Use un tipo de objeto especial diseñado para ser usado como clave. Este es un idioma común para tratar con claves compuestas.

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

Puede usar mi licencia Apache CaseInsensitiveMap 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 semántica simultánea mejor) (vea los comentarios del blog para más detalles).

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

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

La línea de fondo es " La solución más sencilla 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 coherencia. & Quot;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top