Comparación de cadenas en Java


¿Qué significa "comparar dos cuerdas lexicográficamente"?

Author: M.G, 2010-10-31

6 answers

Partiendo de las respuestas de @Bozho y @aioobe, las comparaciones lexicográficas son similares al orden que uno podría encontrar en un diccionario.

La clase Java String proporciona el método .compareTo () para comparar lexicográficamente Cadenas. Se usa así "apple".compareTo ("banana").

El retorno de este método es un int que se puede interpretar de la siguiente manera:

  • devuelve
  • devuelve = = 0 entonces las dos cadenas son lexicográficamente equivalentes
  • devuelve > 0 entonces el parámetro pasado al método compareTo es lexicográficamente primero.

Más específicamente, el método proporciona la primera diferencia distinta de cero en los valores ASCII.

Así, "computer".compareTo ("comparison") devolverá un valor de (int) 'u' - (int) 'a' (21). Dado que este es un resultado positivo, el parámetro ("comparison") es lexicográficamente primero.

También Hay una variante .compareToIgnoreCase () que volverá 0 para "a".compareToIgnoreCase ("A");, por ejemplo.

 131
Author: Philip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 19:40:00

La expresión "comparación" es ligeramente engañosa. Usted no está comparando para la igualdad estricta, pero para qué cadena viene primero en el diccionario (léxico).

Esta es la característica que permite ordenar las colecciones de cadenas.

Tenga en cuenta que esto es muy dependiente de la configuración regional activa. Por ejemplo, aquí en Dinamarca tenemos un carácter" å "que utiliza para escribirse como" aa "y es muy distinto de dos a individuales (EDITAR: If pronunciado como"å"!). Por lo tanto, las reglas de clasificación danesas tratan dos consecutivas a's de forma idéntica a un "å", lo que significa que va después de z. Esto también significa que los diccionarios daneses se ordenan de manera diferente que los ingleses o suecos.

 9
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 09:32:23

El String.compareTo(..) método realiza comparación lexicográfica. Lexicográficamente == alphebetically.

 8
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 19:14:31

Comparando secuencialmente las letras que tienen la misma posición entre sí.. más como cómo ordenar palabras en un diccionario

 8
Author: Ramp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 19:14:32

Si usted comprueba qué cadena vendría primero en un léxico, usted ha hecho una comparación lexicográfica de las cadenas!

Algunos enlaces:

Robado de este último enlace:

Una cadena s precede a una cadena t en orden lexicográfico si

  • s es un prefijo de t , o
  • si c y d son, respectivamente, el primer carácter de s y t en la que s y t son diferentes, entonces c precede a d en el orden de caracteres.

Nota: Para los caracteres que son letras alfabéticas, el orden de los caracteres coincide con el orden alfabético. Los dígitos preceden a las letras, y las letras mayúsculas preceden a las minúsculas.

Ejemplo:

  • la casa precede a la casa
  • El hogar precede a la casa
  • composer precede a computer
  • H2O precede al HOTEL
 4
Author: aioobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-31 19:15:36

Java orden lexicográfico:

  1. Números -antes-
  2. Mayúscula-antes -
  3. Minúsculas

Por extraño que parezca, es verdad...
He tenido que escribir cadenas comparadoras para poder cambiar el comportamiento predeterminado.
Juegue con el siguiente fragmento con mejores ejemplos de cadenas de entrada para verificar el orden (necesitará JSE 8):

import java.util.ArrayList;

public class HelloLambda {

public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<>();
    names.add("Kambiz");
    names.add("kambiz");
    names.add("k1ambiz");
    names.add("1Bmbiza");
    names.add("Samantha");
    names.add("Jakey");
    names.add("Lesley");
    names.add("Hayley");
    names.add("Benjamin");
    names.add("Anthony");

    names.stream().
        filter(e -> e.contains("a")).
        sorted().
        forEach(System.out::println);
}
}

Resultado

1Bmbiza
Benjamin
Hayley
Jakey
Kambiz
Samantha
k1ambiz
kambiz

Tenga en cuenta que esta respuesta es específica de la configuración regional.
Tenga en cuenta que estoy filtrando por un nombre que contiene la letra minúscula a.

 1
Author: Beezer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-26 13:49:02