Frage zum sortierten Ausgeben einer ArrayList!

dbohnen

Mitglied
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
Weiteren muss die Klasse Wort die Methode public String toString() überschreiben, damit
die Ausgabe des Listeninhaltes auf dem Bildschirm funktioniert. Weitere notwendige Attribute und
Methoden (bzw. Konstruktoren) können Sie in die Klasse Wort einfügen.

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:
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);
	  }
}

Hier mal die Klasse Wort, die ich bis jetzt geschrieben habe:
Java:
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

Top Contributor
  • 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:
Java:
 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? :D
Du musst da halt jetzt die Stringlänge ermitteln und vergleichen:
Java:
return this.Wort.length() - o.Wort.length();
DU solltest die Variable lieber klein schreiben :D
  • 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

Mitglied
OK. Danke schonmal!
Jetzt ergeben sich weitere Probleme.
Ich verstehe die Ausgabe jetzt nicht.
Nach dem Starten des Programms wird Folgendes ausgegeben:
Code:
[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
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

Top Contributor
Zuletzt bearbeitet:

Dicka

Mitglied
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

Top Contributor
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? :D
 

Dicka

Mitglied

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

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;
    }
 
}
 

eRaaaa

Top Contributor
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 ?
 

dbohnen

Mitglied
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();
Java:
Ich bedanke mich im voraus.
mfg
dbohnen
 

eRaaaa

Top Contributor
???
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:

Java:
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?
Java:
 return this.Prozente.compareTo(o.Prozente);
 
Zuletzt bearbeitet:

Löffler

Mitglied
so sollte es gehen:

Java:
 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

Top Contributor
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

Mitglied
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 :D
 

eRaaaa

Top Contributor
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:
Java:
	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

Mitglied
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 :p
 

lehvis89

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

Java:
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
Java:
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

Java:
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

Top Contributor
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:

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


Hf
 

Oben