# Treeset sortieren und ausgeben



## mayokleckz (16. Dez 2009)

Hallo,

ich hänge bei meiner Übung schon seit stunden fest und hoffe hier kann mir jemand helfen.
(JAVA NOOB)
Und zwar soll ich aus einer Reihe Bauteile, inkl. deren einzel Bauteile - eine kostenanalyse entwickeln.
Ich hoffe ich bin halbwegs auf dem richtigen Weg. 
Im Moment wenn ich in der Main die test Struktur kreieren will und dann die print funktion der bauteilklasse aufrufe bekomme ich nur Null : 0 ausgegeben. 
Was mach ich falsch. 
Vielleicht schaut da mal jemand von euch drüber. 


```
***********************************************************

import java.util.*;
import java.lang.Comparable;

public class Baugruppe
implements Comparable<Baugruppe>
{
	private String bezeichnung;
	private double fertigungsKosten;
	private double einkaufsKosten;
	
	
	TreeSet<Baugruppe>BGList = new TreeSet<Baugruppe>();
    
    //*******************************Konstruktor
    public Baugruppe()
    {
    	
    }
    
    public Baugruppe(String name, double fK, double eK)
    {
    	this.bezeichnung = name;
    	this.fertigungsKosten = fK;
    	this.einkaufsKosten = eK;
    	
    }
    
    public String getBez()
    {
    	return this.bezeichnung;
    }
    public double getEK()
    {
    	return this.einkaufsKosten;
    }
    public double getFK()
    {
    	return this.fertigungsKosten;
    }
    public double getHK()
    {
    	return (this.getEK()+this.getFK());
    }
     public void addBaugruppe(Baugruppe b)
     {
     	BGList.add(b);
     }
    public void printStructure()
    {
    	if (this.BGList.isEmpty()){
			System.out.println("Einzelteil: " +this.getBez() +": " +this.getHK());
		}
		else{
			System.out.println("Baugruppe: " +bezeichnung +": " +this.fertigungsKosten);
			while (this.BGList.iterator().hasNext()){
				this.printStructure();
				}
		}
		//System.out.println("first" +this.BGList.first());
    }
    
    
    
    //implement Comp //@override
    public int compareTo(Baugruppe b)
    {	
    	final int BEFORE = -1;	//this < b
    	final int EQUAL = 0;	//this = b
    	final int AFTER = 1;	//this > b
    	
    	if(this.getHK() < b.getHK()){
    		return BEFORE;
    	}
    	if(this.getHK() > b.getHK()){
    		return AFTER;
    	}
    
    	return this.getBez().compareTo(b.getBez());
    
    }
}

***********************************************************


public interface TestStructureCreator {
    
    //zu implementierende Methode
    public void createTestStructure();
    
}
***************************************************************

import java.util.TreeSet;

public class TestStructure1
implements TestStructureCreator
{
	
	//variablen für Assoziation bereitstellen
	public Baugruppe pc;
	public Baugruppe midtower,disk,powersupply;
	public Baugruppe asus;
	public Baugruppe pentium,chipset;
	public Baugruppe memory;
	public Baugruppe mem1, mem2;

    //Konstruktor
    public TestStructure1() {
    	
    	//createTestStructure();
    }
    
    //Teststruktur anlegen
    public void createTestStructure()
    {
    	this.pc = 				new Baugruppe("PC",25.00,0.00);
    	this.midtower = 		new Baugruppe("Mid Tower", 0.00, 30.00);
    	this.disk = 			new Baugruppe("Disk 500 GB", 0.00, 80.00);
    	this.powersupply = 		new Baugruppe("PowerSupply", 0.00, 80.00);
    	this.asus = 			new Baugruppe("ASUS_MB", 35.00, 0.00);
    	this.pentium = 			new Baugruppe("P4", 0.00, 180.00);
    	this.chipset = 			new Baugruppe("ChipSet", 0.00, 80.00);
    	this.memory = 			new Baugruppe("Memory 1024", 10.00, 0.00);
    	this.mem1 = 			new Baugruppe("Mem1", 0.00, 35.00);
    	this.mem2 = 			new Baugruppe("Mem2", 0.00, 35.00);
    	
    	this.pc.addBaugruppe(midtower);
    	pc.addBaugruppe(disk);
    	pc.addBaugruppe(powersupply);
    	pc.addBaugruppe(asus);
    	
    	asus.addBaugruppe(pentium);
    	asus.addBaugruppe(chipset);
    	asus.addBaugruppe(memory);
    	
    	memory.addBaugruppe(mem1);
    	memory.addBaugruppe(mem2);
    	
    	System.out.println("createTs"); //methodentestprint
    	 		System.out.println("first" +.first());
    }
}
****************************************************************

public interface Comparable {

    
    public int compareTo(Baugruppe b);
}

****************************************************************

import java.util.*;

public class Main 
{
	
	//test.createTestStructure();
	
	public static void main(String[] args) 
	{
		Baugruppe bG = new Baugruppe();
		TestStructure1 tS1 = new TestStructure1();
		tS1.createTestStructure();
		
		
		/*TestStructureCreator test;
		test.createTestStructure();
		*/
		
		//if(bG.getBez().equals("PC"))
		bG.printStructure();
	}
}
```

Grüße mayo


----------



## SlaterB (16. Dez 2009)

definierst du selber ein Interface Comparable? das gibts doch schon, sowas solltest du nicht machen

----

> bG.printStructure();
bezieht sich auf 
> Baugruppe bG = new Baugruppe();

mit der großen TestStructure machst du gar nichts, außer sie anzulegen, gib die aus


----------



## mayokleckz (16. Dez 2009)

Hi,

comparable hab ich entfernt.

-ausgeben - 
Würd ich ja gern, aber ich komm nicht drauf. Der schmeißt mir dauernd fehlermeldungen raus. 
Ich komm nicht drauf

****Hilf mir****


----------



## SlaterB (16. Dez 2009)

printStructure() von pc in der TestStructure1 aufrufen?
welch ein Hinweis

> Der schmeißt mir dauernd fehlermeldungen raus. 

na ohne genaue Auflistung bei aktuellen Code ist das schwierig zu beantworten


----------



## mayokleckz (16. Dez 2009)

printStructur() von pc im konstruktor der TestStructure1

-> Exception in thread "main" java.lang.NullPointerException
    at W.TestStructure1.<init>(TestStructure1.java:19)
    at W.Main.main(Main.java:13)

in der  createTestStructure()
erst unzählige male -> Baugruppe: PC: 25.0

dann -> Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(SingleByteEncoder.java:91)
    at sun.nio.cs.SingleByteEncoder.encodeLoop(SingleByteEncoder.java:130)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
    at java.iutputStreamWriter.write(OutputStreamWriter.java:190)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
    at java.io.PrintStream.write(PrintStream.java:476)
    at java.io.PrintStream.print(PrintStream.java:619)
    at java.io.PrintStream.println(PrintStream.java:756)

dann unzählige male

-> 
at W.Baugruppe.printStructure(Baugruppe.java:58)

Ich steh voll aufm schlauch.
Würde ein Klassendiagramm helfen mehr tipps zu bekommen?
Ich muss doch nur so nen Baum sortiert anlegen  und in bestimmter reihenfolge wieder ausgeben. 
Ich checks einfach nicht. ???:L
In C ging sowas noch ganz einfach . 

grüße


Edit: unzählige male heißt -> flos private pastebin - collaborative debugging tool


----------



## SlaterB (16. Dez 2009)

> Würde ein Klassendiagramm helfen mehr tipps zu bekommen?

so unzufrieden mit mir? kannst auch ruhig direkt sagen 

so, StackOverflowError als neue Information, ist doch kein Beinbruch, die printStructure ist also noch nicht perfekt,
und da fällt auch sofort auf: this.printStructure();
die eigene Ausgabe nochmal aufzurufen kann ja keinen Sinn machen,

ich würde es ja eigentlich dir überlassen, nochmal über normal richtigen Code nachzudenken, 
aber bevor du allzu schlecht von mir denkst  :

verwende z.B.

```
Iterator<Baugruppe> iter = this.BGList.iterator();
			while (iter.hasNext()) {
				iter.next().printStructure();
			}
```


----------



## mayokleckz (16. Dez 2009)

unzufrieden !?!?!?! Bin froh dass da wer drüber schaut. t.
Ausserdem hab ich eigentlich gedacht du bist angenervt.


Mit dem this.printStructur wollte ich die Untergruppe von pc oder asus ausgeben.
Am Ende soll die Ausgabe folgendermaßen aussehen.
Baugruppe: PC:580.0
Baugruppe: Asus_MB: 375.0
Einzelteil: Pentium4: 180.0
Einzelteil: ChipSet: 80.0
usw.


----------



## mayokleckz (16. Dez 2009)

omg

was is jetzt kaputt.


----------



## SlaterB (16. Dez 2009)

Spam-Beitrag zwischendrin gelöscht,

wie auch immer, läuft es denn jetzt mit meiner Verbesserung?


----------



## mayokleckz (16. Dez 2009)

Hi,
nein leider nicht. Ich bastel grad überall rum.

Also mit deiner Verbesserung hat er einwandfrei kompiliert, aber nichts ausgegeben. Ich geh mal davon aus dass ich den TreeSet nicht sortiert und gefüllt bekomme. Sonst müsste es wenigstens einmal printen.

Oder ich ruf das printStructur() an der falschen Stelle oder ganz falsch auf. 

Im Moment ruf ich es in der Main mit - tS1.pc.printStructure(); - und in class TestStructure in der methode createTestStructure() auf. Wie gesagt - ich bastel grad. Ich programmier nicht. Echt schade. 
Ich weiss einfach nicht mehr weiter.
Wir haben vor 3 Wochen mit JAVA angefangen und ich bin grad hoffnungslos überfordert.
Naja, ich hab noch ein paar stunden


----------



## mayokleckz (16. Dez 2009)

So,  
jetz aber fast.

Hab die printStructure() jetzt folgendermaßen.

```
public void printStructure()
    {
    	if(BGList.isEmpty()){
    		
    		System.out.println("Einzelteil: " +getBez() +": " +getHK());
    		
    	}else{
    		
    		System.out.println("Baugruppe:  " +getBez() +" : " +getHK());
    		Iterator<Baugruppe> iter = this.BGList.iterator();
            while (iter.hasNext()) {
            	
                iter.next().printStructure();
            }
    	}
         
    }
```
Die Ausgabe schaut jetzt folgendermaßen aus. 
Baugruppe:  PC : 25.0
Einzelteil: Mid Tower: 30.0
Baugruppe:  ASUS_MB : 35.0
Baugruppe:  Memory 1024 : 10.0
Einzelteil: Mem1: 35.0
Einzelteil: Mem2: 35.0
Einzelteil: ChipSet: 80.0
Einzelteil: Pentium4: 180.0
Einzelteil: Disk 500 GB: 80.0
Einzelteil: PowerSupply: 80.0

Also schon einmal ganz gut.
Nur wie bekomme ich die jetzt nach baugruppen geordnet raus?

thx schonmal SlaterB


----------



## SlaterB (16. Dez 2009)

ist doch geordnet, nur recht schwer zu erkennen, was zu wem gehört,

in der Liste von PC sind 
[..]
Einzelteil: Mid Tower: 30.0
Baugruppe: ASUS_MB: 35.0
[..]
Einzelteil: Disk 500 GB: 80.0
Einzelteil: PowerSupply: 80.0

richtig sortiert, obwohl in anderer Reihenfolge eingegeben


----------



## mayokleckz (17. Dez 2009)

Ich muss nur noch rausfinden wie ich auf die Elemente zugreife um den Wert zu berechnen, denn die 
Ausgabereihenfolge soll sich primär nach dem Wert richten und sekundär nach dem namen.
zB.:
Pc hat als untergruppe - miditower - disk500 - powersupply - asus
deren Werte muss ich zu PC dazurechnen. und für asus dessen untergeordneten geräte.
Wie krieg ich hin, dass sich eben genau deren Werte addieren. ?


----------



## SlaterB (17. Dez 2009)

so wie du in printStructure() auf die Unterelemente zugreifst und rekursiv printStructure() aufrufst, muss das in der kosten Methode auch passieren,
ganz grob:

```
kosten() {
  int x = eigene Kosten;
  Iterator ..
  while ..
    x += kosten() von Unterteil // rekursiver Aufruf
  }
  return x;
}
```

gut nacht


----------



## mayokleckz (17. Dez 2009)

mein erster versuch war 

```
public double getHK()
    {
    	Iterator<Baugruppe> iter = this.BGList.iterator();
            if(iter.hasNext()){
            	    		
    			return this.getEK();
    	}else{
    		
    		hK += getFK();
    	}while(iter.hasNext()){
    		iter.next().getHK();
    	}	return hK; 
    	
    }
```
Aber alles 0.0 
Auf zur Fehlersuche


----------



## mayokleckz (17. Dez 2009)

Ich habs für heut mal so gelassen


```
public double getHK()
    {
    	double x = getFK(); 
    	
    	Iterator<Baugruppe> iter = this.BGList.iterator();
    	
    	if(iter.hasNext()){
    		while(iter.hasNext()){
    			hK += getEK() + getFK();
    			iter.next().getHK();
    		}return x+hK;
    	}else return getEK(); 
    		
    }
```

aber mit der vergleichsfunktion hauts irgendwie nicht hin.

```
public int compareTo(Baugruppe b)
    {	
    	final int BEFORE = -1;	//this < b
    	final int EQUAL = 0;	//this = b
    	final int AFTER = 1;	//this > b
    	
    	if(this.getHK() < b.getHK()){
    		return BEFORE;
    	}
    	if(this.getHK() > b.getHK()){
    		return AFTER;
    	}
    
    	return this.getBez().compareTo(b.getBez());
    
    }
}
```


----------



## SlaterB (17. Dez 2009)

an compareTo musst du nix ändern, es geht erstmal nur um getHK, und die ist noch nicht gelungen

so, alles auf null, Luft holen, mal 5.2 Sekunden lang überlegen, angenommen ein Element ist ein Einzelstück,
dann fällt die while-Schleife weg, welcher Code wird ausgeführt?
das else, also 
return getEK(); 

wieso das? da sieht man doch selbst 2:00 nachts im Schlaf, dass das Quatsch ist,

da war die alte getHK-Methode
> return (this.getEK()+this.getFK());
ja besser..

die lieferte eindeutig was anderes, welche Sinn kann es haben, nun getFK() nicht mehr miteinzuberechnen?
sicher,  getFK() steht weiter oben in der Methode beim x, aber irgendwo zu stehen bringt nix, wenn es nicht in den Rückgabewert einfließt,
effektif ignorierst du derzeit getFK()..

und wenn mehrere Bauteile enthalten sind (nochmal 3 Sekunden denken)?
in der Schleife steht
> iter.next().getHK();
als Aufruf gar nicht schlecht, aber was passiert mit dem Rückgabewert? kommt 10, 20, oder 200 zurück?
der Wert interessiert gar nicht, wird nicht zum x draufaddiert oder sonstwas, das kann doch keinen Sinn enthalten,

stattdessen steht auch noch pro Schleifendurchlauf
> hK += getEK() + getFK();
hier werden die eigenen Werte nochmal addiert, warum das so oft pro Schleifendurchlauf?
gespeichert wird das in hK, wobei unklar ist, wo diese Variable herkommt, welchen Sinn sie hat, am besten alles dazu ganz weg

das Grundprinzip ist nach wie vor einfach

```
kosten() {
  int x = eigene Kosten;
  Iterator ..
  while ..
    x += kosten() von Unterteil // rekursiver Aufruf
  }
  return x;
}
```
hier ist z.B. kein if else zu sehen,
am Ende nicht 
return x + nochwas;
sondern nur
return x;
versuche doch mehr davon an Struktur zu übernehmen


----------



## mayokleckz (17. Dez 2009)

Moin moin, 

>>return getEK();

>wieso das? da sieht man doch selbst 2:00 nachts im Schlaf, dass das Quatsch ist,

weil ein Einzelstück nur Einkaufskosten hat. und keine Fertigungskosten.

Bastel jetzt weiter. Muss heut fertig werden. 
Und das Anlegen der Sückliste  in der Main muss ich leider auch ändern.Wir sollen das Interface
 TestStrucureCreator benutzen. Ein implementierendes objekt in der MAin erzeugen und dadran aufrufen ?? Naja, 

hK ist eine am Anfang der class deklarierte double variable

grüße


----------

