# compareTo bei Strings?



## LILA (7. Nov 2010)

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?


```
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
> -
> ...



Wenn ich 
	
	
	
	





```
objects[0] = "Strings"; //Strings mit grossem S
```
 definiere bekomme ich folgende 


> Ausgabe:
> 
> Strings
> -
> ...



Eigentlich würde ich aber folgende Ausgabe erwarten:


> Ausgabe:
> 
> sind
> -
> ...



Was mache ich falsch????

Vielen Dank für alle Hinweise. Schönen Abend.


----------



## Michael... (7. Nov 2010)

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.


----------



## moccajoghurt (7. Nov 2010)

wieso ermittelst du die Länge der Strings nicht einfach per String x.length(); ?


----------



## LILA (7. Nov 2010)

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:

```
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?


----------



## Michael... (7. Nov 2010)

LILA hat gesagt.:


> 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


----------

