TreeSet mit Objekten befüllen

ChristianEG

Mitglied
Hallo Liebe Community,

ich sitze zurzeit an einer Aufgabe für meinen Porgrammierkurs. Ich muss jetzt ein TreeSet mit einem Objekt befüllen.

Ich habe ein ArrayList mit den Daten die ich benötige. Das Objekt Konto (Kontonummer, Betrag) soll jetzt im TreeSet erzeugt werden. Insgesamt habe ich 42 Datensätze, davon sind einige Konotnummern doppelt, ich sollte am Ende im TreeSet (doppelte Einträge werden ja gelöscht) auf ca. 12 Einträge kommen.

Ich hab das folgendermaßen versucht:

Java:
protected static TreeSet<Konto> baum = new TreeSet<Konto>();

Jetzt habe ich eine Methode erstellt, in dem das TreeSet befüllt werden soll:

Java:
	public static void writeTree() {
		for (int i = 0; i < Buchungsliste.buchungen.size(); i++) {
			System.out.println(i); 
			baum.add(new Konto(Buchungsliste.buchungen.get(i).buch_kontonr, Buchungsliste.buchungen.get(i).buch_betrag));
		}
		
		 Iterator<Konto> iterator;
		 iterator = baum.iterator();
		 
		 while (iterator.hasNext()){
		      System.out.print("Baum " + iterator.next().getKontonr());
		    }
		}

Mein Problem: Im TreeSet wird nur 1 Objekt erstellt... und zwar vom ersten Eintrag im ArrayList... die FOR-Schleife wird aber insgesamt 42x initialisiert. Wo liegt mein Fehler? Ich komme nicht weiter.

Meine Klasse Konto sieht folgend aus:

Java:
public class Konto implements Comparable<Konto> {

    public String kontonr;
	public String betrag;
	
    
	
    public String getKontonr() {
		return kontonr;
	}

	public void setKontonr(String kontonr) {
		this.kontonr = kontonr;
	}
			
    public String getBetrag() {
		return betrag;
	}

	public void setBetrag(String betrag) {
		this.betrag = betrag;
	}
	
	
	

	public Konto(String KontoNR, String Betrag) {
		this.kontonr = KontoNR;
		this.betrag = Betrag;
    }


	public int compareTo(Konto o) {
		return 0;
	}
	
}

Ich glaube es hängt am compareTo. Ich hab viel gegoogelt und in Büchern nachgeschlagen, aber richtig verstehen tue ich es nicht. Deshalb wende ich mich vertrauensvoll an euch Profis, ich selbst bin nur ein blutiger Anfänger. Wäre sehr nett wenn mir jemand helfen könnte, würde mich freuen!

Liebe Grüße aus Wiesbaden,

Christian
 

Landei

Top Contributor
Java:
baum.add(new Konto(Buchungsliste.buchungen.get(i).buch_kontonr, Buchungsliste.buchungen.get(i).buch_betrag));
funktioniert nicht, Maps haben keine add-Methode, sondern die Methode put. Für eine Map musst du einen Schlüssel und einen Wert angeben. Nur die Schlüsselklasse muss sortierbar sein. Etwa so (hier mit der Kontonummer als Schlüssel)
Java:
baum.put(Buchungsliste.buchungen.get(i).buch_kontonr, new Konto(Buchungsliste.buchungen.get(i).buch_kontonr, Buchungsliste.buchungen.get(i).buch_betrag));

Mehr zu Maps unter: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 12 Datenstrukturen und Algorithmen

Übrigens solltest du hier immer die Fehlermeldung angeben, das ist oft eine wichtige Information, wo es klemmt.
 
Zuletzt bearbeitet:

ChristianEG

Mitglied
Hallo,

vielen Dank für deine schnelle Antwort. Ich hatte das mit put auch schon probiert, habe das Buch zuhause und habe es versucht zu verstehen. Allerdings funktioniert das mit .put bei mir nicht. Eclipse meldet folgendes Problem:

Code:
The method put(String, Konto) is undefined for the type TreeSet<Konto>
 
S

SlaterB

Gast
ein Set ist keine Map, da gibts keine put-Methode?

was soll es denn jetzt werden, Set oder Map, und was funktioniert dann nicht?
ich versuche nochmal das erste Post zu lesen ;)

edit: also put und TreeMap statt TreeSet könnten helfen, am Ende auf die values() zugreifen,
bitte erstmal die Grundfunktionen der Collections kennenlernen
 
Zuletzt bearbeitet von einem Moderator:

ChristianEG

Mitglied
Ich hab das jetzt nochmal etwas anderst gestaltet. So das ich evtl. einen Fehler finden kann.

Folgendermaßen sieht meine writeTree() Methode jetzt aus:

Java:
public static void writeTree() {
		for (int i = 0; i < Buchungsliste.buchungen.size(); i++) {
			System.out.println(i); 
			//baum.add(new Konto(Buchungsliste.buchungen.get(i).buch_kontonr, Buchungsliste.buchungen.get(i).buch_betrag));
			baum.add(new Konto(Buchungsliste.buchungen.get(i).buch_kontonr, Buchungsliste.buchungen.get(i).buch_betrag));
			System.out.println(" add " + Buchungsliste.buchungen.get(i).buch_kontonr);
			System.out.println(" add " + Buchungsliste.buchungen.get(i).buch_betrag);
		}

Als Ausgabe kommt beim Ausführen jetzt.

Code:
0
 add 1001
 add 702,78
1
 add 1005
 add -16,27
2
 add 1004
 add -586,08
3
 add 1010
 add -122,77
4
 add 1002
 add 512,54
5
 add 1006
 add 402,14
6
 add 1005
 add -260,17
7
 add 1011
 add -326,56
8
 add 1003
 add 72,72
9
 add 1007
 add 725,4
10
 add 1006
 add 147,93
11
 add 1012
 add -210,2
12
 add 1004
 add 402,93
13
 add 1008
 add 456,45
14
 add 1007
 add 675,08
15
 add 1013
 add 309,31
16
 add 1005
 add 50,27
17
 add 1009
 add -229,8
18
 add 1008
 add 565,09
19
 add 1014
 add -385,81
20
 add 1006
 add 741,68
21
 add 1010
 add 556,15
22
 add 1009
 add 193,04
23
 add 1015
 add -415,02
24
 add 1007
 add 259,8
25
 add 1011
 add -183,35
26
 add 1010
 add 499,39
27
 add 1016
 add 558,65
28
 add 1008
 add -53,59
29
 add 1002
 add -376,34
30
 add 1006
 add -437,45
31
 add 1005
 add -208
32
 add 1011
 add -143,86
33
 add 1003
 add -334,59
34
 add 1007
 add -324,73
35
 add 1006
 add 218,44
36
 add 1012
 add -164,58
37
 add 1004
 add 500,4
38
 add 1008
 add -28,6
39
 add 1007
 add -730,06
40
 add 1013
 add 242,74
41
 add 1005
 add 765,89

Das sieht schonmal gut aus. Anscheind fügt er in jedem Schritt einmal Kontonummer und Betrag hinzu. Das ganze insgesamt 42x. Wenn ich aber jetzt den TreeSet ausgeben möchte mit folgender Aufrufung:

Java:
 Iterator<Konto> iterator;
		 iterator = baum.iterator();
		 
		 while (iterator.hasNext()){
             System.out.print("Baum " + iterator.next().getKontonr());
           }

Bringt er mir trotzdem nur den ersten Wert, und zwar 1001. Wieso nicht die restlichen?


EDIT: Ich muss leider ein TreeSet verwenden! :(
 
S

SlaterB

Gast
gut, bleiben wir beim Set, ist wohl auch besser,

deine compareTo-Methode bewirkt derzeit, dass je zwei Konto-Objekte immer als gleich angesehen werden,
deshalb wird jedes Element nach dem ersten nicht akzeptiert (add() liefert auch Rückgabewert true/ false)

du musst die compareTo()-Methode so schreiben, dass nur bei wirklich gleichen Daten 0 zurückgegeben wird
 

ChristianEG

Mitglied
Danke für den Hinweis. Klingt auch logisch.

Ich hab mal versucht das so umzusetzen..

Java:
	public int compareTo(Konto o1) {
		if(this.kontonr == ((Konto) o1).kontonr) {
			return 0;
		} else if (this.kontonr != ((Konto) o1).kontonr){
			return 1;
		} else {
			return -1; 
		}
	}

Jetzt werden mir alle Objekte ausgegeben, unsortiert und doppelt. Normalerweise müsste er aber nach einem doppelten Eintrag jetzt ein 0 zurückgeben und diesen nicht hinzufügen?
 
S

SlaterB

Gast
Strings wenn dann mit equals vergleichen,
aber auch eine schlechte Sortiertung kann Probleme bereiten, immer nur 1 zurückzugeben ohne auf Reihenfolge zu achten kann je nach Einfügereihenfolge dazu führen,
dass "x" links von "y" steht, ein neues "x" aber rechts von "y" eingefügt, weiter links gar nicht mehr geschaut wird

verwende einfach die schon vorhandene compareTo-Methode:
return eigeneKontoNr.compareTo(andereKontoNr);

oder als Konsequenz füge direkt die KontoNummern als String in ein Set, brauchst du wirklich Konto-Objekte mit zufälligen Beträgen dazu?
 

ChristianEG

Mitglied
Java:
	public int compareTo(Konto o1) {
		if(this.kontonr.equals(((Konto) o1).kontonr)) {
			return 0;
		} else if (!this.kontonr.equals(((Konto) o1).kontonr)) {
			return 1;
		} else {
			return -1; 
		}
	}

OK. Habe jetzt das equals Eingebaut. Die Ausgabe reduziert sich auch direkt um 10 Einträge. Ich verstehe allerdings nicht genau was return eigeneKontoNr.compareTo(andereKontoNr); bewirkt und wie ich es einbaue. Könntest du mir das etwas genauer erklären?

Wenn ich das jetzt richtig verstanden habe läuft doch die Abfrage mit dem Vergleich falsch. Sprich: Er vergleicht nicht mit allen Objekten im TreeSet auf duplikate sondern nur mit dem "Nachbar" ?


brauchst du wirklich Konto-Objekte mit zufälligen Beträgen dazu?


Sinn ist es, die Buchungen aus der ArrayList in eine Kontoübersicht zu "wandeln". Sprich Konto einmalig ins TreeSet schreiben und bei Duplikaten den Betrag (+/-) dem aktuellen Kontostand zu verrechnen. Am Ende sollten dann alle ~15 Konten im TreeSet mit dem endgültigen Kontostand stehen. Einige Konten haben mehr und andere weniger Buchungen. Aber zunächst habe ich versucht die Konten überhaupt einmalig anzulegen. Das mit dem verrechnen der Beträge kommt, wenn das oben läuft :)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
return this.kontonr.compareTo(((Konto) o1).kontonr));
liefert eine saubere Sortierung

--------

eine TreeMap vergleicht neue Elemente nicht mit ALLEN vorhandenen,
sondern verwendet einen Sortierbaum, jedes Element wird mit der Wurzel, dessen linken oder rechten Nachfolger usw. verglichen um genau einen Platz zwischen allen anderen zu finden,
wenn dieser Platz schon mit einem gleichen belegt ist, dann kann das Doppelte erkannt und eleminiert werden,

bekommt jedes neue Element dagegen relativ zufällig einen beliebigen Platz, dann kann leicht ein anderes gleiches Element an anderem Platz verfehlt werden, es sind zwei gleiche fälschlicherweise im Set,

wenn du immer nur 1 zurückgibst, lieferst du nicht die Information, ob ein Elemente größer oder kleiner als ein anderes ist,
möglicherweise funktioniert es jetzt auch schon, da immer alle Elemente nach ganz rechts verschoben werden und dabei vielleicht an allen anderen vorbeikommen,
aber schön wär das gewiss nicht

-----

mit dem Verrechen wirst du es aber kaum leichter haben wenn beliebige der Ursprungsbeträge schon gesetzt sind, andere aber nicht,
naja, goldene Wege gibts kaum, kann schon klappen
 

ChristianEG

Mitglied
Es läuft. Danke dir!

Ich muss mir das mit der TreeMap mal genau anschauen... bin jetzt aber erstmal froh das es funktioniert, jetzt kann ich mich an die Beträge ran machen. Vielen Dank nochmal..
 
S

SlaterB

Gast
äh ja ich meinte auch das TreeSet, funktionieren eh beide gleich abgesehen davon dass die Map mappt und das Set nicht
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
T Collections TreeSet.contains ruft nicht .equals? Allgemeine Java-Themen 4
B TreeSet-Ausgeben Allgemeine Java-Themen 8
B Collections TreeSet/TreeMap, doppelte Einträge zulassen ? Allgemeine Java-Themen 11
K Collections TreeSet beinhaltet Objektleichen Allgemeine Java-Themen 26
S TreeSet - Comparator ändern -> resort? Allgemeine Java-Themen 8
M Vergleich von TreeSet<HashSet>^2 Allgemeine Java-Themen 8
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
A Effizienzfrage bei TreeSet / XML-Verarbeitung Allgemeine Java-Themen 8
J TreeSet und Comparator will nicht so wie ich Allgemeine Java-Themen 2
J unsortiertes Treeset Allgemeine Java-Themen 2
J TreeSet neues TreeSet aufbauen Allgemeine Java-Themen 8
S Verhalten der Klasse TreeSet... Allgemeine Java-Themen 4
S TreeSet benötigt zu viel Speicher Allgemeine Java-Themen 5
André Uhres BigDecimal in HashSet eingefügt, aber nicht in TreeSet Allgemeine Java-Themen 2
M TreeSet exception bei add Allgemeine Java-Themen 17
E Statt HashSet die TreeSet verwenden Allgemeine Java-Themen 4
G TreeSet ändert sich bei Änderungen nicht! Allgemeine Java-Themen 15
M Fehler in TreeSet.remove() Allgemeine Java-Themen 6
B String Array aus TreeSet Allgemeine Java-Themen 6
T TreeSet neu sortieren Allgemeine Java-Themen 4
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
B Sent and Receive Funktionen zwischen Objekten ermöglichen? Allgemeine Java-Themen 8
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
PCOmega137 Objekten zufällig erzeugte Namen geben Allgemeine Java-Themen 2
T Speichern von Objekten Allgemeine Java-Themen 2
D Serialisierung und Deserialisierung von Objekten - Frageprogramm Allgemeine Java-Themen 4
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
M loeschen von objekten Allgemeine Java-Themen 22
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
K Vergleich von Strings von Objekten Allgemeine Java-Themen 4
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
D Verwaltung von sehr vielen Objekten Allgemeine Java-Themen 12
G problem: array aus objekten Allgemeine Java-Themen 10
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
B OOP Auf Zustandsänderungen von Objekten reagieren Allgemeine Java-Themen 2
H Best Practice zu vielen konstanten Objekten? Allgemeine Java-Themen 10
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
P J-Unit vergleich von 2 Objekten merkwürdig Allgemeine Java-Themen 7
Landei Guice - Injection von "zwischendurch" erzeugten Objekten Allgemeine Java-Themen 4
S Sortieren nach Objekten Allgemeine Java-Themen 13
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
D Von mehreren Objekten eine Eigenschaft abfragen Allgemeine Java-Themen 11
G Array mit neuen Objekten der selben Klasse füllen Allgemeine Java-Themen 2
S Eine Collection von Objekten mit LDAP Syntax filtern Allgemeine Java-Themen 5
M Schnittmenge von Objekten Allgemeine Java-Themen 3
N Performates lesen von Objekten aus Dateien Allgemeine Java-Themen 2
hdi Speichergröße von Objekten & Referenzen Allgemeine Java-Themen 8
hdi JTable: Sortierung von Date-Objekten Allgemeine Java-Themen 4
C ArrayList (mit Objekten) sortieren Allgemeine Java-Themen 12
L Lesen von Objekten aus Datei Allgemeine Java-Themen 17
S Liste mit verschiedenden Objekten Allgemeine Java-Themen 15
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
J ArrayList aus Point-Objekten nach dem x-Wert ordnen Allgemeine Java-Themen 2
T abspeichern und laden von objekten in JFrame Allgemeine Java-Themen 2
G Serialisieren von Objekten : IO Exception beim Schreiben Allgemeine Java-Themen 3
G Kompletten Frame mit allen Objekten resizen Allgemeine Java-Themen 10
G Tagesdifferenz zw. 2 Gregorian Objekten Allgemeine Java-Themen 14
M Endgültiges Löschen von Objekten Allgemeine Java-Themen 7
M Problem mit Objekten Allgemeine Java-Themen 11
B Serialisieren von mehreren Objekten Allgemeine Java-Themen 7
W Threads & Pipes --> Ist eine Übergabe von Objekten mö Allgemeine Java-Themen 7
T casten von Objekten aus einer ArrayList Allgemeine Java-Themen 4
O kommunikation zw. objekten Allgemeine Java-Themen 7
G List mit selbstdefinierten Objekten sortieren Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
M String aus array mit Objekten suchen Allgemeine Java-Themen 26
F Array von Objekten Allgemeine Java-Themen 2
B Darstellung von Objekten dauern unterschiedlich lang ! Allgemeine Java-Themen 5
G hashtable mit objekten Allgemeine Java-Themen 9
G Probleme mit Clonen von Objekten die JComponents enthalten Allgemeine Java-Themen 3
M Alle möglichen Kombinationen von mehreren Objekten berechnen Allgemeine Java-Themen 6
D OOP-Style bei Objekten Allgemeine Java-Themen 35
H Speicher freigeben klappt nicht bei Image Objekten, warum? Allgemeine Java-Themen 8
m@nu Programm-Models in Static-Objekten speichern Allgemeine Java-Themen 5
T Problem mit Zuweisung von Objekten Allgemeine Java-Themen 5
K Ordner/Dateistruktur in Objekten nachbilden Allgemeine Java-Themen 6
C Uebergabe von Objekten nach anklicken von JCheckBox Allgemeine Java-Themen 5
B Array von Objekten Allgemeine Java-Themen 3
W Mit Date-Objekten arbeiten Allgemeine Java-Themen 10
C Sichbarkeit von Objekten / Methoden in verschiedenen Files Allgemeine Java-Themen 7
S Sortieren Von Objekten Nach Attribut Allgemeine Java-Themen 6
lhein Übergabe von Objekten von Java an C über JNI Allgemeine Java-Themen 5
L Event Handling Ausgabe von Radioboxen und befüllen von Comboboxen Allgemeine Java-Themen 1
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
A Methoden Matrixfelder mit Zufallszahlen befüllen Allgemeine Java-Themen 6
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M PdfPTable per for-Schleife befüllen Allgemeine Java-Themen 3
H JasperReport: Parameter befüllen Allgemeine Java-Themen 7
S Array befüllen Allgemeine Java-Themen 14
A mit .equals Array befüllen schlägt teilweise fehl Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben