Was bedeutet "zwei Zeichenfolgen lexikographisch vergleichen"?
Antworten:
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 int
kann wie folgt interpretiert werden:
compareTo
Methode ü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 0
für "a".compareToIgnoreCase ("A");
zum Beispiel.
"computer".compareTo ("comparison")
gibt einen Wert von (int) 'u' - (int) 'a'
20 zurück. Nicht (21).
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.
Die String.compareTo(..)
Methode führt einen lexikografischen Vergleich durch. Lexikographisch == alphebetisch.
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
Java lexikographisch Reihenfolge:
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);
}
}
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.
Unter Algo "vergleiche zwei Saiten lexikographisch"
Geben Sie zwei Zeichenfolgen ein, Zeichenfolge 1 und Zeichenfolge 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.
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