# Frage zum sortierten Ausgeben einer ArrayList!



## dbohnen (9. Jan 2010)

Hi,
ich habe ein kleines Problem.
Ich soll ein Programm schreiben, welches Wörter die in einer Liste stehen, der Länge nach (Anz. der Buchstaben) ausgibt!
Das hier ist die explizite Aufgabenstellung.


> Erweitern Sie das vorgegebene Programm um eine *Klasse Wort*, die ein Wort darstellen soll. Die
> *Klasse Wort* soll das *Interface Comparable implementieren*, damit man Objekte der Klasse Wort
> vergleichen und sortieren kann. Beachten Sie bei der Implementierung der Methode *public int
> compareTo(Wort o)*, dass die Objekte der Länge nach aufsteigend sortiert werden sollen. Des
> ...



Die Klasse WoerterMain habe ich vorgegeben und darf sie *NICHT!* verändern!!!
Diese Klasse schreibt nur die vorgegebenen Wörter in die Liste.
Hier der Quelltext dazu:

```
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class WoerterMain {
	public static void main(String[] args) {
	    List<Wort> liste = new ArrayList<Wort>();
	    liste.add(new Wort("Diese"));
	    liste.add(new Wort("Worte"));
	    liste.add(new Wort("sollen"));
	    liste.add(new Wort("der"));
	    liste.add(new Wort("Laenge"));
	    liste.add(new Wort("nach"));
	    liste.add(new Wort("sortiert"));
	    liste.add(new Wort("werden."));
	    Collections.sort(liste);
	    System.out.println(liste);
	  }
}
```

Hier mal die Klasse Wort, die ich bis jetzt geschrieben habe:

```
public class Wort implements Comparable<Wort> {
	private String  Wort;
	private Wort = null;
	
	public Wort (String string) {
		return;
	}
	
	public void addWort (Wort o) {
		Wort newWort = new Wort(Wort);
		newWort.setContent(newContent);
		
	}
		
	public int compareTo (Wort o) {
		return 0;
	}
	
	public String ToString() {
		return Wort;
	}


}
```

Meine Fragen beziehen sich auf die Methode Wort! Kann ich da so schreiben, damit das Programm weiß, dass ein neues Wort hinzugefügt wird.

Dann weitere Frage. Was mache ich genau mit der Methode compareTo, die soll ja dafür sorgen, dass die Wörter der Anzahl nach aufsteigend sortiert werden. Kann ich das dann auf "null" setzen.

Und als letztes steht in der Aufg-Stellung ich soll die Methode String ToString überschreiben, damit die Ausgabe funktioniert. Womit muss ich die überschreiben?

Ihr seht ich habe viele Fragen!
Vielleicht kann mir einer helfen.

mfg dbohnen


----------



## eRaaaa (9. Jan 2010)

dbohnen hat gesagt.:


> Meine Fragen beziehen sich auf die Methode Wort! Kann ich da so schreiben, damit das Programm weiß, dass ein neues Wort hinzugefügt wird.


1.) Das ist keine Methode, sondern ein Konstruktor. Es muss wohl eher so sein:

```
public Wort (String string) {
        this.Wort = string;
    }
```

2.) private Wort = null; sowie die Methode addWort brauchst du garnicht ! Du sollst hier keine Collection nachbauen oder so etwas..das addWort was du hier nachbauen willst, macht ja quasi schon die main-Methode, in dem sie deine Wörter zu der Liste hinzufügt !


> Dann weitere Frage. Was mache ich genau mit der Methode compareTo, die soll ja dafür sorgen, dass die Wörter der Anzahl nach aufsteigend sortiert werden. Kann ich das dann auf "null" setzen.


?? wieso auf null setzen? 
Du musst da halt jetzt die Stringlänge ermitteln und vergleichen:

```
return this.Wort.length() - o.Wort.length();
```
DU solltest die Variable lieber klein schreiben 


> Und als letztes steht in der Aufg-Stellung ich soll die Methode String ToString überschreiben, damit die Ausgabe funktioniert. Womit muss ich die überschreiben?


Nö, du sollst toString() überschreiben  Womit, hast du ja schon.


----------



## dbohnen (9. Jan 2010)

OK. Danke schonmal!
Jetzt ergeben sich weitere Probleme.
Ich verstehe die Ausgabe jetzt nicht.
Nach dem Starten des Programms wird Folgendes ausgegeben:

```
[Wort@19821f, Wort@addbf1, Wort@42e816, Wort@9304b1, Wort@190d11, Wort@a90653, Wort@de6ced, Wort@c17164]
```

Was ist das denn? Wo kommt das denn her "Wort@[bla]"? Wie kann ich das vermeiden?
Wort.java
[Java]

public class Wort implements Comparable<Wort> {
	private String  Wort;

	public Wort (String string) {
		this.Wort = string;
	}

	public int compareTo (Wort o) {
		return this.Wort.length() - o.Wort.length();
	}

	public String ToString() {
		return Wort;
	}

}
[/code]
WoerterMain.java

```
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class WoerterMain {
	public static void main(String[] args) {
	    List<Wort> liste = new ArrayList<Wort>();
	    liste.add(new Wort("Diese"));
	    liste.add(new Wort("Worte"));
	    liste.add(new Wort("sollen"));
	    liste.add(new Wort("der"));
	    liste.add(new Wort("Laenge"));
	    liste.add(new Wort("nach"));
	    liste.add(new Wort("sortiert"));
	    liste.add(new Wort("werden."));
	    Collections.sort(liste);
	    System.out.println(liste);
	  }
}
```
mfg
dbohnen


----------



## eRaaaa (9. Jan 2010)

Den Tipp hatte ich dir eben schon gegeben!


```
public String ToString() {
        return Wort;
```

ist falsch! (mit einer Annotation hätte man das sehr schnell merken können ;D )


```
public String toString() {
        return Wort;
```

Lesestoff: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.2 Object ist die Mutter aller Klassen

Da steht auch woher die unlesbare Ausgabe kommt


----------



## dbohnen (9. Jan 2010)

jut, ich bin dann mal Lesen... 'die Mutter aller Klassen' und so...


----------



## Dicka (9. Jan 2010)

Also soweit ich weiss, kann Collections.sort() nur Objekte vom Typ String, int und so weiter sortieren. Will man eine Liste von z.B. Autos mit sort() sortieren, muss man sort() schon sagen, wonach er sortieren soll. Und dafür nimmt man das Interface Comparator und nicht Comparable. 

Eigentlich müsste es auch gehen, wenn man compareTo() vernünftig implementiert. Das hast du getan. Jetzt würde mich interessieren, warum es nicht läuft.


----------



## eRaaaa (9. Jan 2010)

Dicka hat gesagt.:


> Also soweit ich weiss, kann Collections.sort() nur Objekte vom Typ String, int und so weiter sortieren. Will man eine Liste von z.B. Autos mit sort() sortieren, muss man sort() schon sagen, wonach er sortieren soll. Und dafür nimmt man das Interface Comparator und nicht Comparable.
> 
> Eigentlich müsste es auch gehen, wenn man compareTo() vernünftig implementiert. Das hast du getan. Jetzt würde mich interessieren, warum es nicht läuft.



Irgendiwe widerspricht sich das doch ein wenig?!
Also erstmal lässt sich mit Collections.sort jedes Objekt sortieren, welches entweder das Interface Comparable implementiert (was dann automatisch dazu kommt, dass die Methode compareTo implementiert werdne muss) oder man gibt halt der Methode extra einen Comparator mit an.

Da hier aber Wort das Interface implementiert und auch korrekt, sollte Collections.sort die Liste mit Wort-Objekten sortierne können(tut`s ja auch ;D, )



> Jetzt würde mich interessieren, warum es nicht läuft.



tut es nicht?


----------



## Dicka (9. Jan 2010)

eRaaaa hat gesagt.:


> tut es nicht?



Also ich bekomme ne Fehlermeldung, wenn ich den korrigierten Code kompilieren will. Und zwar folgende:

cannot find symbol
symbol: method.sort(java.util.List<Wort>)
location: class.java.util.Collections
     Collections.sort(liste);

ratlos.....unten der Code nochmal...


```
public class Wort implements Comparable<Wort> {
    private String  wort;
    
    public Wort (String string) {
        this.wort = string;
    }
        
    public int compareTo (Wort o) {
        return this.wort.length() - o.wort.length();
    }
    
    public String toString() {
        return wort;
    }
 
}
```


----------



## eRaaaa (9. Jan 2010)

Kann ich jetzt gerad nicht nachvollziehen sorry. Sollte laufen. Und du hast die WoerterMain auch nicht abgeändert? Die ist auch vollständig? (mit allen imports ? ) Und liegt im gleichen package wie die Wort-Klasse ?


----------



## Dicka (9. Jan 2010)

Mmh, seltsam! Hab die kompilierten Dateien gelöscht und neu kompiliert. Nun gehts...DANKE!


----------



## dbohnen (11. Jan 2010)

Hallo,
ich habe nochmal eine Frage zu einer ähnlichen Aufgabe!
Diesmal soll ich die Liste nicht nach der Länge der Strings sprtieren, sondern nach der Größe der Zahl.

GetraenkeMain.java
[Java]import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class GetraenkeMain {
	public static void main(String[] args) {
	    List<Getraenk> liste = new ArrayList<Getraenk>();
	    // Quelle: Alkoholgehalt verschiedener Getränke - Gesundheit und Medizin auf qualimedic.de
	    liste.add(new Getraenk("Wein", 10.0));
	    liste.add(new Getraenk("Obstler", 35.0));
	    liste.add(new Getraenk("Bier", 5.0));
	    liste.add(new Getraenk("Whisky", 50.0));
	    liste.add(new Getraenk("Sekt", 10.0));
	    liste.add(new Getraenk("Calvados", 55.0));
	    liste.add(new Getraenk("Wermut", 18.0));
	    liste.add(new Getraenk("Eierlikoer", 20.0));
	    liste.add(new Getraenk("Fruchtlikoer", 30.0));
	    liste.add(new Getraenk("Kraeuterlikoer", 33.0));
	    liste.add(new Getraenk("Korn", 32.0));
	    liste.add(new Getraenk("Weinbrand", 40.0));
	    Collections.sort(liste);
	    System.out.println(liste);
	  }
}
[/code]

Getraenk.java
[Java]public class Getraenk implements Comparable<Getraenk> {
	private String Getraenk;
	private Double Prozente;


	public Getraenk (String string, double Double) {
		this.Getraenk = string;
		this.Prozente = Double;
	}

	public int compareTo (Getraenk o) {
		return this.Prozente.intValue() - o.Prozente.intValue();
	}

	public String toString() {
		return Getraenk;
	}

}[/code]

Wie gesagt ich soll die Getränke nach der Pozentanzahl sortieren!
Leider fehlt mir der Befehl, mit welchem ich das erreiche!

Bei meinem Programm ist es in dieser Zeile.
[JAVA=11]return this.Prozente.intValue() - o.Prozente.intValue();
	
	
	
	





```
Ich bedanke mich im voraus.
mfg
dbohnen
```


----------



## eRaaaa (11. Jan 2010)

???
Erste Frage an dich: Wieso benutzt du den Wrapper Double anstelle von double?
Zweite Frage: Wieso holst du dir dann den int-Wert? this.Prozente.doubleValue() würde ich ja verstehen, aber wieso int? Das verfälscht doch dein Ergebnis, denn 10.3 und 10.6 Prozent wären ja dann bei dir gleich ?!

Ich würde erstmal das Double erstmal wieder zum Primitiven double machen und dann sowas wie:


```
double erg = a - b;
	if (erg > 0)
	    return 1;
	else if (erg < 0)
	    return -1;
	else
	    return 0;
```

Oder aber wenn du eh ein Double hast, wieso bneutzt du dann nicht das compareTo von Double?

```
return this.Prozente.compareTo(o.Prozente);
```


----------



## Löffler (11. Jan 2010)

so sollte es gehen:


```
public class Getraenk implements Comparable<Getraenk> {
    private String getraenk;
    private Double Prozent;
    
    
    public Getraenk (String string, double Double) {
        this.getraenk = string;
        this.Prozent = Double;
    }
    
    public int compareTo (Getraenk o) {
        return o.Prozent.intValue() - Prozent.intValue();


    }
    
    public String toString() {
        return getraenk +" " +Prozent +"%";
    }
}
```


----------



## eRaaaa (11. Jan 2010)

Du hast doch da jetzt nur auf- mit absteigender Sortierung geändert oder?


----------



## Löffler (11. Jan 2010)

ja und das this entfernt, er hat das ja vorher schon benutzt         this.getraenk = string;
        this.Prozent = Double;

und dann klappt der rest auch


----------



## eRaaaa (11. Jan 2010)

Was hat das this. mit dem Problem zu tun? Ob ich das nun hinschreibe oder Peng ändert in dem Fall doch nichts an der Funktionsweise? Das Problem ist viel mehr, dass int benutzt wird. Lies nochmal meinen Beitrag !


----------



## Löffler (11. Jan 2010)

also das Problem war bei mir wirklich das this , als ich das weggelassen habe ging es...
warum das so is, weiss ich selber nicht wirklich bzw interessiert es mich in diesem Fall auch nicht


----------



## eRaaaa (11. Jan 2010)

Löffler hat gesagt.:


> also das Problem war bei mir wirklich das this , als ich das weggelassen habe ging es...
> warum das so is, weiss ich selber nicht wirklich bzw interessiert es mich in diesem Fall auch nicht



Klar geht das, die Frage ist nur ob`s richtig geht, und da ist die Antwort wohl eher NEIN!


----------



## dbohnen (11. Jan 2010)

eRaaaa hat gesagt.:


> Klar geht das, die Frage ist nur ob`s richtig geht, und da ist die Antwort wohl eher NEIN!



ich muss @Löffler aber zustimmen. es funktioniert wirklich. oh man... java-sprache...schwere sprache... :bae:


----------



## eRaaaa (11. Jan 2010)

Macht was ihr wollt! :bae:
Mehr als auf Fehler hinweisen und Verbesserungsvorschläge kann man nicht geben, was ihr daraus macht ist euer Bier 

Ich gebe euch nur nochmal den Tipp eure Implementierung mal mit Folgendem zu testen:

```
liste.add(new Getraenk("Wein", 10.0));
	liste.add(new Getraenk("Wein", 10.1));
	liste.add(new Getraenk("Wein", 10.4));
	liste.add(new Getraenk("Wein", 10.3));
	liste.add(new Getraenk("Wein", 10.3));
```

Bye


----------



## Löffler (11. Jan 2010)

eRaaaa hat schon recht, es geht nur in diesem Fall, also für die Getränke die in deiner vorgegebenen main Klasse sind.
dort reicht es mit int zu Vergleichen, da die Werte hinter der komma stelle nicht beachtet werden müssen...
für den Fall den eRaaa da angibt funktioniert das ganze dann nicht mehr, da du nun wirklich die nachkommastelle vergleichen musst und das geht halt nur mit double...

diesen Fall habe ich ausser acht gelassen, da in der vorgegebenen main es nicht benötigt wurde


----------



## lehvis89 (14. Jan 2010)

hi^^ 
ich habe ein ähnliches problem..
ich habe ein main gegeben..hier werden orte + postleitzahl in die liste eingefügt (bleibt unverändert)


```
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class OrtMain3 {
  public static void main(String[] args) {
    List<Ort> liste = new ArrayList<Ort>();
    liste.add(new Ort("Peitz", "03185"));
    liste.add(new Ort("Drebkau", "03116"));
    liste.add(new Ort("Feldberg", "79868"));
    liste.add(new Ort("Lieberose", "15868"));
    Collections.sort(liste, new OrtName());
    System.out.println(liste);
  }
}
```

ich soll nun eine klasse Ort erstellen, welche die plz + namen beinhaltet, sowie eine weitere OrtName , die das Interface Comparator implementiert, damit man Objekte der Klasse Ort vergleichen und sortieren kann.

hier meine klasse Ort

```
public class Ort {
  private String name;
  private String plz;
   
  public Ort(String name, String plz) {
    this.name = name;
	this.plz = plz;
  }	   

  public void setzeName(String name) {
    this.name = name;
  }  
  public String gibName() {
    return this.name;
  }	
  public void setzePlz(String plz) {
    this.plz = plz;
  }
  public String gibPlz() {
    return this.plz;
  }	
}
```

und OrtName


```
import java.util.Comparator;

public class OrtName implements Comparator<Ort> {

  public int compare(Ort ort1, Ort ort2) {
    if (ort1.gibName == null && ort2.gibName == null) {
	  return 0;
	}
    if (ort1.gibName == null) {
      return 1;
    }
    if (ort2.gibName == null) {
      return -1;
    }
    
    return ort1.gibName.compareTo(ort2.gibName);
  }
 }
```

nur leider erkennt er das "symbol" gibName nicht..steh auf den schlauch und seh nicht mehr durch und weiter -_- ... vllt hat jmd eine idee  wer keine lust hat, erspart sich bitte jeglichen dummen kommi :rtfm::shock: xD 
danke schonma allein fürs lesen x)


----------



## eRaaaa (14. Jan 2010)

Weil gibName eine Methode ist ! gibName -> gibName()
In deinem Comparator reicht die letzte Zeile, des weiteren solltest du unbedingt die toString-Methode in deiner Klasse Ort überschreiben!
z.B, so:


```
@Override
    public String toString() {
	return name + " " + plz;
    }
```


Hf


----------

