Zeichenfolgenvergleich in Java


Antworten:


157

Ausgehend von den Antworten von @Bozho und @aioobe ähneln lexikografische Vergleiche der Reihenfolge, die man in einem Wörterbuch finden könnte.

Die Java-String-Klasse bietet die .compareTo ()Methode zum lexikografischen Vergleich von Strings. Es wird so verwendet "apple".compareTo ("banana").

Die Rückgabe dieser Methode intkann wie folgt interpretiert werden:

  • gibt <0 zurück, dann ist der String, der die Methode aufruft, zuerst lexikographisch (kommt zuerst in einem Wörterbuch)
  • Gibt == 0 zurück, dann sind die beiden Zeichenfolgen lexikografisch äquivalent
  • Gibt> 0 zurück, dann ist der an die compareToMethode übergebene Parameter zuerst lexikographisch.

Insbesondere liefert das Verfahren die erste Differenz ungleich Null in ASCII-Werten.

Somit "computer".compareTo ("comparison")wird ein Wert von (int) 'u' - (int) 'a'(20) zurückgegeben. Da dies ein positives Ergebnis ist, ist der Parameter ( "comparison") zuerst lexikographisch.

Es gibt auch eine Variante , .compareToIgnoreCase ()die zurückkehren wird 0für "a".compareToIgnoreCase ("A");zum Beispiel.


Kollatierungsvergleiche (dh 'é' entspricht 'e') finden Sie unter download.oracle.com/javase/1.5.0/docs/api/java/text/…
Philip

Nur eine Kleinigkeit. "computer".compareTo ("comparison")gibt einen Wert von (int) 'u' - (int) 'a'20 zurück. Nicht (21).
Coding Bad

Die Sprache, in der sich das Wörterbuch befindet, ist ebenfalls wichtig. Dafür ist Locale da.
Thorbjørn Ravn Andersen

11

Der Wortlaut "Vergleich" ist leicht irreführend. Sie vergleichen nicht auf strikte Gleichheit, sondern darauf, welche Zeichenfolge im Wörterbuch (Lexikon) an erster Stelle steht.

Mit dieser Funktion können Sammlungen von Zeichenfolgen sortiert werden.

Beachten Sie, dass dies sehr stark vom aktiven Gebietsschema abhängt. Zum Beispiel haben wir hier in Dänemark ein Zeichen "å", das früher als "aa" geschrieben wurde und sich sehr von zwei einzelnen a unterscheidet (EDIT: Wenn als "å" ausgesprochen !). Daher behandeln dänische Sortierregeln zwei aufeinanderfolgende a identisch mit einem "å", was bedeutet, dass es nach z geht. Dies bedeutet auch, dass dänische Wörterbücher anders sortiert sind als englische oder schwedische.


1
Interessant! Vergleicht javas dies, um dies zu berücksichtigen?
Aioobe

1
@aioobe, dies wird besser erklärt als ich im Java-Tutorial: download.oracle.com/javase/tutorial/i18n/text/…
Thorbjørn Ravn Andersen


8

Vergleichen Sie nacheinander die Buchstaben, die dieselbe Position haben, miteinander. Eher wie Sie Wörter in einem Wörterbuch bestellen


6

Wenn Sie überprüfen, welche Zeichenfolge in einem Lexikon an erster Stelle steht, haben Sie einen lexikografischen Vergleich der Zeichenfolgen durchgeführt!

Einige Links:

Aus dem letzteren Link gestohlen:

Eine Zeichenfolge s steht in lexikografischer Reihenfolge vor einer Zeichenfolge t, wenn

  • s ist ein Präfix von t oder
  • Wenn c und d jeweils das erste Zeichen von s und t sind, in dem sich s und t unterscheiden, steht c in der Zeichenreihenfolge vor d .

Hinweis: Bei alphabetischen Buchstaben stimmt die Zeichenreihenfolge mit der alphabetischen Reihenfolge überein. Ziffern stehen vor Buchstaben und Großbuchstaben vor Kleinbuchstaben.

Beispiel:

  • Haus geht Haushalt voraus
  • Haushalt geht Haus voraus
  • Komponist geht Computer voraus
  • H2O geht HOTEL voraus

3

Java lexikographisch Reihenfolge:

  1. Zahlen -vor-
  2. Großbuchstaben -vor-
  3. Kleinbuchstaben

So seltsam das auch scheint, es ist wahr ...
Ich musste Komparatorketten schreiben, um das Standardverhalten ändern zu können.
Spielen Sie mit dem folgenden Snippet mit besseren Beispielen für Eingabezeichenfolgen, um die Reihenfolge zu überprüfen (Sie benötigen 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);
}
}

Ergebnis

1Bmbiza
Benjamin
Hayley
Jakey
Kambiz
Samantha
k1ambiz
kambiz

Bitte beachten Sie, dass diese Antwort länderspezifisch ist.
Bitte beachten Sie, dass ich nach einem Namen filtere, der den Kleinbuchstaben a enthält.


0

Unter Algo "vergleiche zwei Saiten lexikographisch"

  1. Geben Sie zwei Zeichenfolgen ein, Zeichenfolge 1 und Zeichenfolge 2.

  2. für (int i = 0; i <str1.length () && i <str2.length (); i ++)

    (Durchlaufen Sie jedes Zeichen beider Zeichenfolgen und vergleichen Sie sie, bis eine der Zeichenfolgen endet.):

    ein. Wenn der Unicode-Wert beider Zeichen gleich ist, fahren Sie fort.

    b. Wenn der Unicode-Wert des Zeichens von Zeichenfolge 1 und der Unicode-Wert von Zeichenfolge 2 unterschiedlich sind, geben Sie (str1 [i] -str2 [i]) zurück.

  3. wenn die Länge von String 1 kleiner als String2 ist

    return str2 [str1.length ()]

    sonst

    return str1 [str2.length ()]

    // Diese Methode vergleicht zwei Zeichenfolgen lexikografisch

    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;
        }
    }
    

Wenn zwei Zeichenfolgen gleich sind, wird 0 zurückgegeben, andernfalls wird ein negativer oder positiver Wert zurückgegeben

Quelle: - Quelle

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.