2017-12-31 113 views
2

Compareto geben Sie mir nicht -10 für größere Argument. (Wenn die Zeichenfolge mit Argument gleich ist, dann bekomme ich 0).bei der Verwendung von competheto für Strings gibt 10 die ganze Zeit

String str2 = "Strings are immutable"; 
    String str3 = "Int is a"; 

    int result = str3.compareTo(str2); 
    System.out.println(result); 

    result = str2.compareTo(str3); 
    System.out.println(result); 

Wenn Sie die Größe von str2 oder str3 ändern, ist die Rückgabe identisch. Warum das?

+0

Was ist Ihre genaue Frage? – Ward

+0

* "Wenn Sie die Größe von Str2 oder Str3 ändern, ist die Returnnummer gleich" * Der Rückgabewert hat nichts mit der * Länge * der Zeichenkette zu tun Hinweis: Der Abstand zwischen 'I' und "S" in Unicode ist 10 Zeichen. (Code Punkt 73 vs Code Punkt 83.) Aber verlassen Sie sich nicht darauf, wie Eran darauf hinweist. –

+1

schauen Sie sich das an. Https://docs.oracle.com/javase/9 /docs/api/java/lang/String.html#compareTo-java.lang.String- – zhh

Antwort

7

Das einzige, worauf Sie sich beim Vergleich von Strings mit compareTo verlassen können, ist, dass die Ausgabe < 0 ist, wenn der String, vor dem Sie die Methode aufrufen, vor dem anderen String liegt (nach lexikographischer Reihenfolge),> 0 wenn er kommt nach dem anderen String und 0, wenn sie gleich sind.

Vom Javadoc:

int java.lang.String.compareTo (String anotherString)

Vergleicht zwei Strings lexikographisch. Der Vergleich basiert auf dem Unicode-Wert jedes Zeichens in den Zeichenfolgen. Die von diesem String-Objekt dargestellte Zeichenfolge wird lexikografisch mit der durch die Argument-Zeichenfolge dargestellten Zeichenfolge verglichen. Das Ergebnis ist eine negative Ganzzahl, wenn dieses String-Objekt lexikographisch vor der Argument-Zeichenkette steht. Das Ergebnis ist eine positive Ganzzahl, wenn dieses String-Objekt lexikographisch der Argument-Zeichenkette folgt. Das Ergebnis ist Null, wenn die Strings gleich sind; compareTo gibt genau 0 zurück, wenn die Methode equals (Object) den Wert true zurückgibt.

Sie sollten keine Annahmen von dieser Methode zurück in Bezug auf den tatsächlichen Wert machen, denn das ist eine Implementierung Detail, dass in einer zukünftigen Version von Java ändern können.

Die Implementierung von Java 8 gibt c1 - c2 zurück, wobei c1 und c2 das erste Paar der entsprechenden Zeichen der verglichenen Strings sind, die nicht gleich sind. Die Länge der verglichenen Strings wirkt sich nur auf den zurückgegebenen Wert aus, wenn eine Zeichenfolge eine Teilzeichenfolge der anderen Zeichenfolge ist.

public int compareTo(String anotherString) { 
    int len1 = value.length; 
    int len2 = anotherString.value.length; 
    int lim = Math.min(len1, len2); 
    char v1[] = value; 
    char v2[] = anotherString.value; 

    int k = 0; 
    while (k < lim) { 
     char c1 = v1[k]; 
     char c2 = v2[k]; 
     if (c1 != c2) { 
      return c1 - c2; 
     } 
     k++; 
    } 
    return len1 - len2; 
} 

In Ihrem Beispiel der verglichenen String s in ihrem ersten Charakter unterscheiden, so wird str2.compareTo(str3)str2.charAt(0)-str3.charAt(0) zurückkehren und str3.compareTo(str2) wird str3.charAt(0)-str2.charAt(0) zurück.

2

Zunächst einmal, Sie sollten nicht versuchen, den Rückgabewert von compareTo in irgendeiner anderen Art und Weise als negativ, Null, positiven zu interpretieren. Die Größe des zurückgegebenen Wertes hat keine Bedeutung.

Das heißt, String.compareTo in OpenJDK sieht wie folgt aus:

public int compareTo(String anotherString) { 
    int len1 = value.length; 
    int len2 = anotherString.value.length; 
    int lim = Math.min(len1, len2); 
    char v1[] = value; 
    char v2[] = anotherString.value; 

    int k = 0; 
    while (k < lim) { 
     char c1 = v1[k]; 
     char c2 = v2[k]; 
     if (c1 != c2) { 
      return c1 - c2; 
     } 
     k++; 
    } 
    return len1 - len2; 
} 

Da Strings in alphabetischer Reihenfolge die Länge der Saiten spielt keine Rolle, zu vergleichen - eine Zeichenfolge beginnend mit ich kommen, bevor eine Zeichenfolge beginnen mit S unabhängig davon, wie lange sie sind.

Im Falle von Strings vergleichen wir jedes Zeichen in der Zeichenfolge mit dem Zeichen an der gleichen Stelle in der anderen Zeichenfolge alphabetisch und um dies in Java zu tun, können wir einen einfachen Trick verwenden.

In Java können wir Arithmetik unter char s durchführen und dazu müssen wir verstehen, wie Zeichen wirklich dargestellt werden. Sie sehen das Zeichen I aber der Computer sieht die code point73 - für S der Codepunkt ist 83. Wenn String.compareTo sieht, dass S und I sind nicht das gleiche Zeichen es gibt S - I, die in Code-Point-Arithmetik 83 - 73 ist und das ist, warum Sie 10 (oder -10 erhalten, wenn Sie die Reihenfolge der Saiten wechseln.

Verwandte Themen