2017-06-18 5 views
0
public static void main(String[] args) { 
    System.out.print("Comparing \"axe\" with \"dog\" produces "); 
    // I don't understand what this does. 
    int i = "axe".compareTo("dog"); 
    System.out.println(i); 

    System.out.print("Comparing \"applebee's\" with \"apple\" produces "); 
    // neither this. 
    System.out.println("applebee's".compareTo("apple")); 


} 

Wenn ich den Code ausführen kommt es mit -3 und der nächsten ist 5, Ich verstehe nicht, wie Sie Buchstaben vergleichen und es kommt mit Zahlen. Die „applebee“ und der „Hund“ sind nicht einmal String-Variablen Diese für eine Zuordnung ist in der Schule bei this LinkWas bedeutet die CompareTo Funktion in Java in dieser Situation tut

+0

http://programmingbydoing.com/a/compareto-challenge.html –

+1

[Zeichenfolge # compareTo] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html # compareTo-java.lang.String-) –

+1

"Ich verstehe nicht, wie Sie Buchstaben und Zahlen vergleichen können" - zB https://en.wikipedia.org/wiki/Levenshtein_distance oder im Grunde alle Arten von Möglichkeiten, die Sie denken, um Strings, z. Wenn die Längen unterschiedlich sind, geben Sie den Unterschied zurück, dann machen Sie keinen Vergleich mehr. – luk2302

Antwort

1

Die Java-String-Klasse die .compareTo() Methode, um Strings zu vergleichen lexikographisch liefert.

Die Rückkehr dieses Verfahrens ist ein int die wie folgt interpretiert werden kann:

  • kehrt < 0 dann die String Aufruf der Methode lexikographisch erste ist (an erster Stelle in einem Wörterbuch)
  • kehrt == 0 dann das zwei Zeichenketten sind lexikografisch äquivalent
  • gibt > 0 zurück, dann ist der Parameter, der an die compareTo-Methode übergeben wird, lexikografisch zuerst.

In Ihrem Beispiel:

"axe".compareTo("dog") Rückkehr -3 weil axe lexikographisch ersten im Wörterbuch wird kommen.

Es beginnt mit dem ersten Zeichen jedes Strings: a kommen vor d in dictionary.if den verglichenen Zeichen sind lexikographisch Äquivalent es auf die nächsten Zeichen in der Zeichenfolge gehen, sie zu vergleichen und so weiter. kommt zuerst im Wörterbuch

"applebee's".compareTo("apple") 

Die ersten 5 Zeichen in dem ersten Zeichenfolge "apple" lexikographisch entsprechen zweite Saite aber Zeichen nach dem zweiten String bee's kommen, so dass es 5 zurückkehren wird, die größer als 0 weil zweite Zeichenfolge ist.

0

Die spezifischen Zahlen zurück von compareTo sind ein Implementierungsdetail Sie nicht zu kümmern versuchen sollte. Die Dokumentation von compareTo gibt an, dass alles, was Sie kümmern sollen über das Zeichen: ist die Zahl negativ (a.compareTo(b) < 0 impliziert a < b), Null (a.compareTo(b) impliziert a-b gleich) oder positiv (a.compareTo(b) > 0 impliziert a > b).

2

Vor der Praxis ist mein Rat, die Dokumentation zu lesen. In diesem Fall erklärt die Oracle-Referenz eindeutig den Grund für positive und negative Zahlen:

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 ganze Zahl, wenn dieses String-Objekt lexikographisch vor der Argument-Zeichenfolge 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.

Und hier erklärt, warum - und + :

Dies ist die Definition der lexikographischen Ordnung ist. Wenn zwei Zeichenfolgen unterschiedlich sind, dann haben sie entweder unterschiedliche Zeichen bei einem Index, der für beide Zeichenfolgen ein gültiger Index ist, oder ihre Längen sind unterschiedlich oder beides. Wenn sie an einer oder mehreren Indexpositionen unterschiedliche Zeichen haben, sei k der kleinste derartige Index; dann geht die Zeichenfolge, deren Zeichen an der Position k den kleineren Wert hat, wie unter Verwendung des Operators < bestimmt, der anderen Zeichenfolge lexikografisch voran. In diesem Fall gibt compareTo die Differenz der beiden Zeichenwerte an der Position k in der Kette zwei - das heißt, der Wert:

this.charAt(k)-anotherString.charAt(k) 

Wenn keine Indexposition ist, an den sie sich unterscheiden, dann folgt die kürzere Zeichenfolge lexikographisch der längeren Zeichenfolge. In diesem Fall gibt compareTo die Differenz der Längen der Zeichenfolgen, die heißt, der Wert:

this.length()-anotherString.length()