JAVA - mitzählen von erstellten objekten

Joined
Jan 3, 2003
Messages
3,917
Reaction score
0
hey bin gerade ziemlich verzweifelt weil ich keinen lösungsansatz habe und hoffe ihr könnt mir helfen
undzwar sollen wir eine software zum an- und verkauf von goldwaren programmieren ich denke das fundament steht soweit aber an einer stelle beiße ich mir die zähne aus
ich möchte, dass der anfangsbestand meiner ringe 3 ist
und dass wenn ich ein object "ring" erstelle der bestand = 4 ist
und wenn ich ein weiteres object "ring" erstelle der bestand = 5 angezeigt wird
ich habe nun versucht eine while-schleife zu basteln aber irgenwie erhöht sich nach ablauf der schleife der bestand nicht um 1
somit steht bei jedem erstellten ring bestand = 4
zur verdeutlichung habe ich ein screen angehängt
ich hoffe hier kennt sich einer aus :/
 

Attachments

  • java2.jpg
    java2.jpg
    219 KB · Views: 108
Last edited:
Ich denke du hast den Quellcode schon zu oft gesehen.

In deinem Beispiel steht:
Java:
int x = 3;
int y = 1;

while(this.anzahlringe < x+y)
{
    this.anzahlringe++;
}

Etwas anders geschrieben wird der Fehler ganz klar.

Java:
while(this.anzahlringe < 4)
{
    this.anzahlringe++;
}
int x = 3;
int y = 1;

Da du x und y immer mit 3 und 1 initialisierst, ist es somit an der Stelle, wo es um die Erhöhung des Wertes von "this.anzahlringe" geht auch immer 4. Somit ist die Bedingung der While-Schleife nur solange erfüllt, wie this.anzahlringe < 4 ist. Vor der letzten augeführten Erhöhung ist this.anzahlringe also noch 3 und nach der letzten inkrementierung 4. Danach wird die Bedingung nicht mehr erfüllt.

Hau einfach die While-Schleife raus und mach daraus nur:
Java:
this.anzahlringe++;

Und sofern du x und y noch benötigst:
Java:
int x = 3;
int y = 1;

this.anzahlringe++;
 
erscheint mir anhand des codes ziemlich logisch o0

du setzt initial deine Variable auf 3
im Konstruktor hast du dann ne while schleife deren Bedingung (anzahlringe < x+y ) lautet
x & y sind beide konstant bei dir und x+y ist 4 - wenn das also einmal durchgelaufen ist, ist anzahlringe = x+y = 4 und es wird nicht weitergezählt


edit:
osbes war schneller :D
 
ja klar logisch :D
aber leider bezieht sich der neue ring wieder auf die 3 und spuckt dann bestand = 4 aus....
ich weiß nicht wie ich es hinbekomme, dass oben die 3 mit der anzahl der erstellten objekte wächst
 

Attachments

  • java3.jpg
    java3.jpg
    225.1 KB · Views: 23
Dafür gibt es das Schlüsselwort static.

Java:
static int anzahlringe = 3;
 
-_-
sagt mir leider nix
haben leider bisher nur basics gemacht (9 vorlesungen bisher gehabt)
werde dann wohl ein buch lesen müssen wegen so einer scheiße -___-
trotzdem danke
 
Das Attribut static macht deine Variable zu einer Klassenvariablen oder anders ausgedrueckt, die Variable ist durch static nicht mehr an ein Objekt gebunden. Ohne static hat jedes Objekt, welches du erzeugst eine eigenes Attribut 'anzahlringe', welches unabhaengig von den anderen Instanzen behandelt wird. Nach dem initialisieren hattest du dieses in jedem Objekt fuer sich alleine inkrementiert. Mit static loest du nun 'anzahlringe' aus dem Objektkontext heraus und macht es somit "global" verfuegbar. Daher koennen nun alle Objekte auf ein und die selbe Variable zugreifen und diese dann auch richtig inkrementieren.
 
vielen dank :D
ihr habt mich echt einen großen schritt weitergebracht
renos gibts morgen ;)
 
Sooooo meine freunde ich melde mich mit einem neuen Prob. zurück und hoffe ihr könnt mir erneut helfen

das Prob. stellt sich folgendermaßen dar.
Ich habe eine array liste gebaut, die man auch auf der konsole ausgeben kann - nun möchte ich jedoch, dass diese liste tabellarisch dargestellt wird.
das soll bedeuten, dass die anzahl der spalten fix ist aber die anzahl der zeilen varrierbar ist, sodass man neu erstelle objekte ebenfalls in diese arrayliste hinzufügen kann.
natrülich habe ich das prob. schon gegoogelt aber finde keine antwort die mich hinreichend befriedigt und hoffe ihr könnt mir wieder helfen

optimal wäre folgendes:

Kunden ID | Name | Vorname | Telefonnummer
----------------------------------------------------------------
101 | Peter | Wasweißich | 019044444
----------------------------------------------------------------
102 usw.

Unbenannt.JPG
 
du kannst dafür die printf Methode nutzen, damit kannst du recht elegant auch tabellarische Ausgaben erstellen

habe hier mal ein kleines Beispiel das recht nah an deinem problem ist gebastelt:

Java:
import java.util.LinkedList;
import java.util.ListIterator;

public class GoldShop {
	LinkedList<Kunde> kunden = null;

	class Kunde {
		String name, vorname, telefon = null;

		public Kunde(String name, String vorname, String telefon) {
			this.name = name;
			this.vorname = vorname;
			this.telefon = telefon;
		}
	}

	public GoldShop() {
		kunden = new LinkedList<Kunde>();
		kunden.add(new Kunde("Meier", "Hans-Christian", "012356172341"));
		kunden.add(new Kunde("Peter", "Klaus", "012356157232"));
		kunden.add(new Kunde("Heinrich-Hermann", "Otto", "333344441751"));
	}

	private void printCustomers() {
		ListIterator<Kunde> kundenIterator = kunden.listIterator();
		Kunde curr = null;
		int laengsterVorname = 15;
		while (kundenIterator.hasNext()) {
			curr = (Kunde) kundenIterator.next();
			System.out.printf("%-20s | %-" + laengsterVorname + "s | %s \n",
					curr.name, curr.vorname, curr.telefon);
		}

	}

	public static void main(String[] args) {
		GoldShop myGoldShop = new GoldShop();
		myGoldShop.printCustomers();
	}
}

habe da mit 3 Varianten gearbeitet, da du den Parametern die printf bekommt immer auch eine Länge mitgeben kannst

System.out.printf("%-20s | %-" + laengsterVorname + "s | %s \n", curr.name, curr.vorname, curr.telefon);

Der Standard um einfach nur einen String auszugeben wäre "%s", das habe ich in dem Fall für die Telefonnummer genutzt - "%-20s" hier steht die 20 für die Länge die für diesen String genutzt werden soll, das minuszeichen steht für 'linksbündig'
die Variante "blabla | %"+laengsterVorname+"s | blabla..." ist im Prinzip das selbe - nur wurde die 20 durch eine Variable ersetzt - du könntest also vor der Ausgabe jeweils das längste Element jeder Spalte bestimmen und dann dort eintragen, dann kommt ne hübsche Tabelle raus
in dem Beispiel hier habe ich mir das Bestimmen des längsten Elements mal gespart, das dürfteste du ja selber hinbekommen, denke ich
 
und wieder habe ich einen kleinen hänger -__-

undzwar fehlen noch genau zwei dinge bis zur vollendung meines meisterwerks :DD
jedoch hänge ich wieder an einer(zwei) stelle(n) :O

undzwar möchte ich, nach einem bestimmten produkt oder namen suchen können, den er dann tabellarisch ausgibt

z.B. such nach Kunden: Hermann

ID | Name | Vorname | Telefonnummer
----------------------------------------------------
102| Klaus | Herrmann | 0190555555555


das zweite Prob. ist, dass wenn ich einen Artikel verkaufe, dass dieser anschließend aus meiner Arrayliste verschwindet (und keine Lücke entsteht)
 

Attachments

  • -_-.JPG
    -_-.JPG
    92.1 KB · Views: 21
Last edited:
verstehe bei beiden Problemen nicht so ganz wo es da hakt
im Suchen-Fall schnappst du dir deinen Iterator auf der Liste und iterierst drüber, bis das aktuelle Element (das solltest du dir in jeder Iteration zwischenspeichern), das Element ist, das du suchst - danach musst du ja nur noch die Daten deines aktuellen Elements ausgeben.

der verkaufs-fall läuft ähnlich ab - du suchst dir dein Element wieder und rufst dann auf deinem Iterator die remove-Methode auf.
 
ich hab mein Beispielprogramm einfach mal weitergeführt - wichtig für dich sind die Funktionen printCustomer und deleteCustomer
Java:
import java.util.LinkedList;
import java.util.ListIterator;

public class GoldShop {
	LinkedList<Kunde> kunden = null;

	class Kunde {
		String name, vorname, telefon = null;

		public Kunde(String name, String vorname, String telefon) {
			this.name = name;
			this.vorname = vorname;
			this.telefon = telefon;
		}
	}

	public GoldShop() {
		kunden = new LinkedList<Kunde>();
		kunden.add(new Kunde("Meier", "Hans-Christian", "012356172341"));
		kunden.add(new Kunde("Hermann", "Peter", "337123441751"));
		kunden.add(new Kunde("Peter", "Klaus", "012356157232"));
		kunden.add(new Kunde("Heinrich-Hermann", "Otto", "333344441751"));
	}

	private void printCustomers() {
		ListIterator<Kunde> kundenIterator = kunden.listIterator();
		Kunde curr = null;
		int laengsterVorname = 15;
		while (kundenIterator.hasNext()) {
			curr = (Kunde) kundenIterator.next();
			System.out.printf("%-20s | %-" + laengsterVorname + "s | %s \n",
					curr.name, curr.vorname, curr.telefon);
		}
	}

	private void printCustomer(String name) {
		ListIterator<Kunde> kundenIterator = kunden.listIterator();
		while (kundenIterator.hasNext()) {
			Kunde curr = (Kunde) kundenIterator.next();
			if (curr.name.equals(name)) {
				System.out.printf("%-20s | %-15s | %s \n", curr.name,
						curr.vorname, curr.telefon);
			}
		}
	}

	private void deleteCustomer(String name) {
		ListIterator<Kunde> kundenIterator = kunden.listIterator();
		while (kundenIterator.hasNext()) {
			Kunde curr = (Kunde) kundenIterator.next();

			if (curr.name.equals(name)) {
				kundenIterator.remove();
				break;
			}
		}
	}

	public static void main(String[] args) {
		GoldShop myGoldShop = new GoldShop();
		myGoldShop.printCustomers();
		System.out.println("\n\n");
		System.out.println("Der Kunde Hermann");
		myGoldShop.printCustomer("Hermann");
		System.out.println("\n\nKunde Hermann wird entfernt\n");
		myGoldShop.deleteCustomer("Hermann");
		myGoldShop.printCustomers();
	}
}
 
eine hyopsbotschatft

habe überlesen, dass der Goldpreis variabel sein soll.... aber sie sind in meinem Quelltext fix, da ich folgendermaßen definiert habe:

Golpreis333=10
Goldpreis555=20
Goldpreis777=27
ich habe nun eine setGoldpreis methode geschrieben, welche sagt: Goldpreis333=eingabe
nun habe ich aber folgendes Problem:
Verändere ich nun den Goldpreis, dann nimmt nur ein neu erstelltes Produkt den neuen Wert an aber die anderen 3Artiel, die ich als Grundbestand definiert habe, bleiben unverändert und nehmen mit 10,20 oder 27 mal
(da Preis = Gewicht*Goldpreisxxx)

Wie bekomm ich es nun hin, dass die 3 Grunbestandsartikel nicht mit den fixen zahlen multiplizieren, sondern nachdem ich den Goldpreis abgeändert habe ihren Pries neu kalkulieren und sie in meiner Tabelle ausgeben???



Meine Idee war wie folgt:
public class Goldpreis
{
public static double kurs;
public static double goldpreis333 = 10*kurs;
public static double goldpreis555 = 20*kurs;
public static double goldpreis777 = 27*kurs;


public void setKurs(double kurs)
{
double eingabe;
eingabe = Stdin.readlnDouble();
if (eingabe != 1)
{
kurs = eingabe;
}
else
{
kurs = 1;
}


}


was jedoch dazu führt, dass der Preis bei jedem Artikel 0 ist -__-

brauche dringend hilfe - weiß echt keinen rat mehr :(
 
an welchem Punkt berechnest du denn den Preis eines jeden Produkts?

du könntest doch nachdem du den Goldpreis geändert hast, deine Collection mit den Produkten durchgehen und jedem Objekt sagen, es möge seinen Preis neu berechnen o.Ä.
 
es läuft bisher folgendermaßen
die produkte, die ich im bestand habe nehmen bei reinheit333 den preis 10*gewicht
verändere ich nun den wert der reinheit - sagen wir mal 11 - multipliziert nur das neu erstelle produkt mit dem wert 11 und alle vorher erstellen bleiben fix -_-
möchte nun, dass auch die vorher erstellten produkte (auch die grundbestandsartikel) dann mit dem wert 11 multiplizieren
 
schonmal was von set und get methoden gehohrt?
Mach die Methode setkurs anders und bau set methoden für die verschiedenen goldpreise ein.
Code:
public class Goldpreis
{
  public static double kurs;
  public static double goldpreis333;
  public static double goldpreis555;
  public static double goldpreis777;


  public void setKurs(double eingabe)
 {
   /*Die Prüfung an dieser Stelle macht keinen Sinn, da nur wenn eingabe=1 der else Zweig ausgeführt wird und damit auch kurs=eingabe sein kann. Wenn eingabe nicht kleiner als 1 sein darf ergibt das eher Sinn*/
   if (eingabe != 1)
   {
     kurs = eingabe;
   }
   else
   {
    kurs = 1; 
   }
 }
 public double getKurs(){
   return kurs;
 }
 public void setGoldpreis777(double arg){
   goldpreis777 = 27*arg;  
 }
 public void setGoldpreis333(double arg){
   goldpreis333 = 10*arg;  
 }
 public void setGoldpreis555(double arg){
   goldpreis555 = 20*arg;  
 }
 public void berechne(){
   double dbl_eingabe;
   dbl_eingabe = Stdin.readlnDouble();
   setKurs(dbl_eingabe);
   setGoldpreis333(getKurs());
   setGoldpreis555(getKurs());
   setGoldpreis777(getKurs());
 }
}
Ich glaub so is das eher von Erfolg gekrönt ;)

€: Lol Problem nicht ordentlich gelesen.
Du musst wohl beim Ändern des Goldpreises alles Objekten die erstellt wurden sagen, dass sie ihre Preise doch neu beschaffen sollen.
Is schon etwas länger her dass ich Java gemacht habe aber schau mal was ein EventHandler ist, darüber bekommst es sicher geregelt.
Ansonsten musst du in der Neuberechnung eine Funktion erstellen, auf die die anderen Funktionen zugreifen wenn sie aufgerufen wird.
Ist mir im Moment zu viel weil ich grad besuch hab ;)
 
Last edited:
Is schon etwas länger her dass ich Java gemacht habe aber schau mal was ein EventHandler ist, darüber bekommst es sicher geregelt.
Allgemeiner gesagt, solltest du dir z.B. das Observerpattern angucken (http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)) ist in Java quasi schon vorhanden (klick). Es geht sicher auch noch eleganter, aber der Code ist mir für diese Uhrzeit zu anstrengend, um mir das alles anzuschauen.
Ist das ne Hausaufgabe oder so? Oder soll da mal was ähnliches ernsthaftes draus werden?
 
Ja genau, das meinte ich doch.
Ich guck mir auch erst morgen mal ne Lösung aus, hab schon was getrunken und will nicht mehr nachdenken.
 
Back
Top