Java Implementierung eines Apotheken-Teemischungs-Programms

Firestorm-

Lt. Commander
Registriert
Okt. 2006
Beiträge
2.015
Tag zusammen,

ich hab folgendes Problem: Es soll ein Programm geschrieben werden, welches folgendes Szenario darstellt:
Ein Kunde kommt in eine Apotheke und möchte Tee kaufen. Dieser Tee besteht aus Mischungen von Tee-Drogen, welche wiederrum aus Mischungen bestehen können, jedoch die Anteile festgelegt sind. Ziel ist es über die gewünschte Gesamtmenge des Kunden und den festgelegten Anteilen der Drogen und Mischungen zueinander den Gesamtpreis jeder Droge bzw. Mischung zu ermitteln, sowie die einzelnen Mengen, basierend auf den Mischungsverhältnissen zueinander.
Es handelt sich hier um eine Konsolenumsetzung des Programms. Als Pattern wurde von mir Composite verwendet.
Eine grafische Oberfläche kommt irgendwann demnächst noch drüber, mir geht es jetzt erstmal um die Programmierung an sich.

Das Programm ist soweit fertig, trotz allem bekomm ich Exceptions, verursacht durch eingesetzte Iteratoren beim Ausgeben der Mischungen.

"Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at mitArrayList.Mischung.ausgeben(Mischung.java:118)
at mitArrayList.Testprogramm_Tee.main(Testprogramm_Tee.java:37)"



Beschreibung aus der API dazu:
"Diese Exception wird ausgelöst, wenn ein Thread eine Kollektion verändert, während ein anderer Thread über diese Kollektion iteriert und die Kollektion keine Manipulationen während der Iteration zuläßt."



Nun ja, nach langer Fehlersuche bin ich leider nicht fündig geworden. Meine Vermutung liegt auf der toString Methode der Klasse "Mischung".

Würde mich freuen wenn jemand von euch mal einen Blick darauf werfen könnte.

Passwort für das Archiv: apotheke

Link zum Archiv(rapidshare): http://rapidshare.com/files/228433002/Kompositum_Teemischungen.rar.html

MfG und Danke im voraus!

Fire
 
Ja mit der Vermutung liegst du nicht ganz falsch:

Ohne den Code mal zu kompilieren, hab ich folgende Vorschläge.
Nimm die Iteratoren aus dem Member-Bereich raus und pack sie jeweils eine Zeile vor dem while(). Das sollte der Trick sein.

Noch besser, ab Java 1.5, verwende die folgende Syntax:

- lösch die Iteratoren Zeilen und mach nur noch:

Code:
for(Tee tee : arrTee) {
   tee.ausgeben();
}
Macht es für dich deutlich leserlicher und du weist sofort welches Objekt bearbeitet wird. Und ConcurrentModificationException kann man damit gut verhindern :)

Auch dafür dringend empfohlen, da du doch nie weißt wo dein iterator gerade ist:

Dein Code:
Code:
		while(itgrProDroge.hasNext()){
			// grammProDroge * Preis von jeder Droge * GrammGesamt der Mischung = Gesamtpreis der Mischung
			gesamtPreis += itgrProDroge.next() * (1 * itArrTee.next().getPreis() * getGrammGesamt() );
		}


Mein Vorschlag:

Code:
		for(Double grammProDroge : grProDroge  ){
			// grammProDroge * Preis von jeder Droge * GrammGesamt der Mischung = Gesamtpreis der Mischung
			for(Tee tee : arrTee ){
				 gesamtPreis += grammProDroge  * (1 * tee.getPreis() * getGrammGesamt() );
			}
		}

Siehe: http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html

Des Weiteren würde ich immer das Interface verwenden also:

Code:
[B]List [/B]<Tee> arrTee = new ArrayList <Tee>();

So kannst du leichter auf andere Implementationen als ArrayList zugreifen bei bedarf.

Und zum Schluss fragte ich mich noch was denn daran rekursiv ist, wenn man deinen Kommentaren trauen mag :)


EDIT: Wo ich's gerade sehe. double (und float) sind Fließkomma Zahlen. Wenn du nach mehrere Operationen und Rundungen noch einen exakten Wert haben willst, nimm BigDecimal.

Warum? Darum :)

Code:
double val = 0;
for(int i=0;i<10;i++) {
   val+=0.1;
   System.out.println(val);
}

Ausgabe ist:

Code:
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999




Gruß
Nox
 
Zurück
Oben