web-dev-qa-db-fra.com

Comparaison de chaînes dans Java

Que veut dire "comparer deux chaînes lexicographiquement"?

73
Harshana

À partir des réponses de @Bozho et @aioobe, les comparaisons lexicographiques ressemblent à celles que l’on pourrait trouver dans un dictionnaire.

La classe String Java) fournit la méthode .compareTo () afin de comparer lexicographiquement des chaînes. Elle est utilisée comme ceci "Apple".compareTo ("banana").

Le retour de cette méthode est un int qui peut être interprété comme suit:

  • renvoie <0 alors la chaîne appelant la méthode est lexicographiquement en premier (vient en premier dans un dictionnaire)
  • renvoie == 0 alors les deux chaînes sont équivalentes lexicographiquement
  • renvoie> 0 puis le paramètre passé à la méthode compareTo est lexicographiquement premier.

Plus précisément, la méthode fournit la première différence non nulle dans les valeurs ASCII.

Ainsi, "computer".compareTo ("comparison") renverra une valeur de (int) 'u' - (int) 'a' (20). Comme il s'agit d'un résultat positif, le paramètre ("comparison") Est d'abord lexicographe.

Il existe également une variante .compareToIgnoreCase () qui renverra 0 Pour "a".compareToIgnoreCase ("A"); par exemple.

152
Philip

Le terme "comparaison" est légèrement trompeur. Vous ne comparez pas pour une égalité stricte mais pour quelle chaîne vient en premier dans le dictionnaire (Lexicon).

C'est la fonctionnalité qui permet de trier les collections de chaînes.

Notez que cela dépend très de la locale active. Par exemple, ici au Danemark, nous avons un caractère "å" qui tilisé doit être orthographié "aa" et qui est très distinct de deux simples (EDIT: If prononcé comme "une"!). Par conséquent, les règles de tri danoises traitent les deux conséquences consécutives a de manière identique à un "å", ce qui signifie qu'elles suivent le z. Cela signifie également que les dictionnaires danois sont triés différemment des dictionnaires anglais ou suédois.

11

La méthode String.compareTo(..) effectue une comparaison lexicographique. Lexicographiquement == alphebétiquement.

8
Bozho

Comparer séquentiellement les lettres qui ont la même position l'une par rapport à l'autre.

8
Ramp

Si vous vérifiez quelle chaîne viendrait en premier dans un lexique, vous avez effectué une comparaison lexicographique des chaînes!

Quelques liens:

Volé de ce dernier lien:

Une chaîne s précède une chaîne t dans l’ordre lexicographique si

  • s est un préfixe de t , ou
  • si c et d sont respectivement le premier caractère de s et t dans lequel s et t diffèrent, alors c précède d dans l'ordre des caractères.

Remarque: Pour les caractères alphabétiques, l'ordre des caractères coïncide avec l'ordre alphabétique. Les chiffres précèdent les lettres et les majuscules les minuscules.

Exemple:

  • la maison précède le ménage
  • Le ménage précède la maison
  • compositeur précède l'ordinateur
  • H2O précède HOTEL
6
aioobe

Java lexicographiquement ordre:

  1. Numéros -avant-
  2. En majuscule avant
  3. Minuscule

Aussi étrange que cela puisse paraître, c'est vrai ...
J'ai dû écrire des chaînes de comparaison pour pouvoir modifier le comportement par défaut.
Jouez avec l'extrait suivant avec de meilleurs exemples de chaînes d'entrée pour vérifier l'ordre (vous aurez besoin de 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);
}
}

Résultat

1Bmbiza
Benjamin
Hayley
Jakey
Kambiz
Samantha
k1ambiz
kambiz

S'il vous plaît noter que cette réponse est spécifique à Locale.
Veuillez noter que je filtre pour un nom contenant la lettre minuscule a.

2
Beezer

Below Algo "compare deux chaînes lexicographiquement"

  1. Entrez deux chaînes chaîne 1 et chaîne 2.

  2. pour (int i = 0; i <str1.length () && i <str2.length (); i ++)

    (Parcourez chaque caractère des deux chaînes en les comparant jusqu'à ce que l'une des chaînes se termine):

    une. Si la valeur unicode des deux caractères est identique, continuez;

    b. Si la valeur unicode du caractère de la chaîne 1 et la valeur unicode de la chaîne 2 sont différentes, alors retourne (str1 [i] -str2 [i])

  3. si la longueur de la chaîne 1 est inférieure à la chaîne2

    retourne str2 [str1.length ()]

    else

    retourne str1 [str2.length ()]

    // Cette méthode compare deux chaînes lexicographiquement

    public static int compareCustom(String s1, String s2) {
        for (int i = 0; i < s1.length() && i< s2.length(); i++) {
            if(s1.charAt(i) == s2.charAt(i)){
                //System.out.println("Equal");
                continue;
            }
            else{
                return s1.charAt(i) - s2.charAt(i);
            }   
        }
        if(s1.length()<s2.length()){
            return s2.length() - s1.length();
        }
        else if(s1.length()>s2.length()){
            return s1.length()-s2.length();
        }
        else{
            return 0;
        }
    }
    

si deux chaînes sont égales, il retournera 0 sinon la valeur sera négative ou positive

Source: - Source

0
Ved Prakash