May 30

Comparar cadenas en java. Clase Collator

Para comparar cadenas en java tenemos los métodos tradicionales que todos conocemos, aunque quizás no sea tan conocida la clase Collator.

Por un lado, el == nos compara si las dos instancias de las cadenas son exactamente la misma. No es la comparación que se debería usar para comparar cadenas de texto, puesto que nos podemos llevar sorpresas. String a = "Hola" es distinto de String b = new String("Hola")

El método equals() de la clase String sí compara las cadenas y nos dice si son iguales o no en contenido. El problema de este método es que distingue mayúsculas de minúsculas y de letras con acento. Con este método, son distintos "Hola", "HOLA" y "Hóla".

El método compareTo() de la clase String nos da un poco más de información. Devuelve cero si son iguales, negativo si una es menor que la otra y positivo si es mayor. El problema de este método es que considera las letras ordenadas según estén en la tabla de caracteres que usemos. Por ejemplo, si usamos códigos ASCII, entonces ‘A’ está antes de ‘a’ que a su vez está antes de ‘á’. Por ello, "Hola" sería menor que "Zapato" y este menor "hola". Un orden alfabético basado en este método, daría primero las palabras que empiezan por mayúscula y luego las mismas con minúscula.

Para conseguir una ordenación alfabética real, deberíamos usar la clase Collator. Esta clase, en función del idioma, tiene en cuenta todo esto. Collator se puede configurar para que considere que ‘A’, ‘a’ y ‘á’ son iguales o para que los considere distintos. La forma de ordenación alfabética correcta se conseguiría con este código

// Se obtiene un Collator adecuado para nuestro idioma.
Collator comparador = Collator.getInstance();

// Se configura para que ‘A’, ‘a’ y ‘á’ sean iguales.
comparador.setStrength(Collator.PRIMARY);

// Estas dos cadenas son iguales, compare() daría cero
System.out.println(comparador.compare("HOLa", "hóla"));

Tienes todo esto un poco más detallado en cómo comparar cadenas en java en la Chuwiki.

3 Responses to “Comparar cadenas en java. Clase Collator”

  1. neok Says:

    Deberías añadir a la lista contentEquals (), es un método que funciona muy bien.

  2. Chuidiang Says:

    Hola:

    No conocía el método. Lo he mirado y no veo mucha diferencia con equals(). Le echaré un ojo con más detalle y actualizaré el blog -y la chuwiki-

    Se bueno.

  3. neok Says:

    Según creo es igual que equals, nada más que equals pertenece al tipo Object (si no me equivoco) y contentEquals al tipo String.

    Así equals es un método que compara objetos, nada más que en String se ha sobreescrito o sobrecargado (no sé muy bien como se llama), y contentEquals es nativo del tipo String.

Leave a Reply