compareTo bei Strings?

LILA

Aktives Mitglied
Hallo Forum,

irgendwie habe ich das Gefühl, dass ich die Methode compareTo in diesem Fall nicht richtig einsetze ich bekomme nicht das kürzeste Wort zurück....
Was mache ich falsch?

Java:
public class Main {

    /**
     * @param args the command line arguments
     */
    public static Object getSmallest(Comparable[] objects){
        Object smallest = objects[0];
        for(int i = 1; i < objects.length; ++i){
            if(objects[i].compareTo(smallest) < 0){
                smallest = objects[i];
            }
        }
        return smallest;
    }

    public static void bubbleSort(Comparable[] objects){
        boolean sorted;
        do{
            sorted = true;
            for(int i = 0; i < objects.length - 1; ++i){
                if(objects[i].compareTo(objects[i +1 ]) > 0){
                    Comparable tmp = objects[i];
                    objects[i] = objects[i + 1];
                    objects[i + 1] = tmp;
                    sorted = false;
                }
            }
        } while (!sorted);
    }
    
    public static void main(String[] args){
        //Erzeugen eines String-Arrays
        Comparable[] objects = new Comparable[4];
        objects[0] = "strings";
        objects[1] = "sind";
        objects[2] = "paarweise";
        objects[3] = "vergleichbar";
        //Ausgeben des kleinsten Elements
        System.out.println((String)getSmallest(objects));
        System.out.println("-");
        //Sortieren und Ausgeben
        bubbleSort(objects);
        for (int i = 0; i < objects.length; i++){
            System.out.println((String)objects[i]);
        }
    }
}

Ausgabe:

paarweise
-
paarweise
sind
strings
vergleichbar

Wenn ich
Java:
objects[0] = "Strings"; //Strings mit grossem S
definiere bekomme ich folgende
Ausgabe:

Strings
-
Strings
paarweise
sind
vergleichbar

Eigentlich würde ich aber folgende Ausgabe erwarten:
Ausgabe:

sind
-
sind
Strings
paarweise
vergleichbar

Was mache ich falsch????

Vielen Dank für alle Hinweise. Schönen Abend.
 
keine Ahnung wie jetzt compareTo bei String konkret implementiert ist - es orientiert sich aber auf jeden Fall an der alphabetischen Reihenfolge.
Wenn Du die Längen vergleichen willst, musst Du auch die Längen (String#length()) vergleichen.
 
Stimmt, der sortiert das irgendwie alphabetisch.... Is mir noch garnicht aufgefallen. Vielen Dank für den Hinweis.

Eigentlich mache ich das nur, weil ich das Buch "Handbuch der Java-Programmierung" durcharbeite.

In der Klasse Sting ist die Methode so definiert:
Java:
 public int compareTo(String anotherString) {
	int len1 = count;
	int len2 = anotherString.count;
	int n = Math.min(len1, len2);
	char v1[] = value;
	char v2[] = anotherString.value;
	int i = offset;
	int j = anotherString.offset;

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

Eigentlich müsste ich doch dann die Länge zurückbekommen, da count die Anzahl der Zeichen im String ist, oder?
 
Eigentlich müsste ich doch dann die Länge zurückbekommen, da count die Anzahl der Zeichen im String ist, oder?
Die Längendifferenz ist nur eine von drei (eigentlich sinds nur zwei) möglichen Rückgabewerten. Wenn man sich die Implementierung genauer anschaut, sieht man, dass Längen nur eine Rolle spielen, wenn ein String identisch mit den Anfangsbuchstaben des anderen Strings ist, zB. abc verglichen mit abcdefghi
 

Neue Themen


Zurück
Oben