Java Objekte mit Foreach ausgeben

_Headsh0t_

Ensign
Registriert
Juni 2011
Beiträge
227
Hallo zusammen,

Ich habe eine Klasse Rohstoffe, eine Klasse Items und eine Klasse Main.

In der Main-Klasse will ich über eine showShop()-Methode alle Rohstoffe in einer foreach-Schleife ausgeben lassen.

Der Rohstoffe Konstruktor sieht wie folgt aus
Code:
Rohstoffe(int id, String name, int strength, int cost, int price)

in der Items-Klasse erzeuge ich die Rohstoffe-objekte wie folgt:
Code:
Rohstoffe stein = new Rohstoffe(0, "Stein", 0, 10, 5);
Rohstoffe eisen = new Rohstoffe(1, "Eisen", 1, 20, 8);

wie kann ich nun in der Main auf die Rohstoffe in Items zugreifen und in einer Schleife ausgeben?

MfG
 
Mach eine Liste, z.b. ArrayList und füg die Rohstoffe ein.

include java.util.ArrayList;


ArrayList<Rohstoffe> rohstoffliste = new ArrayList<Rohstoffe>();
rohstoffliste.add(new Rohstoffe(0, "Stein", 0, 10, 5));
rohstoffliste.add(new Rohstoffe(1, "Eisen", 1, 20, 8));

for (Rohstoffe rohstoff : rohstoffliste) {
rohstoff.DoSomething();
System.out.println(rohstoff);
}

Für Syntax oder Semantikfehler wird keinerlei Haftung übernommen :D
 
Zuletzt bearbeitet:
stimme Theobald 93 zu, wobei: List<Rohstoffe> rohstoffliste = new ArrayList<Rohstoffe>();
 
Also soll ich jeden Rohstoff nochmal neu erzeugen?

In der Items-Klasse würde die ArrayList wenig Sinn ergeben, da ich so dem Objekt ja garkeinen Namen geben kann.
Und dementsprechend in anderen Klassen nicht über stein.getId() o.Ä. auf den Rohstoff zugreifen kann.

in der ShopMethode könnte ich auch genauso gut
Code:
System.out.println(Rohstoffe.stein.getName());
usw.
für jeden Rohstoff machen. So viel "Schreibarbeit" wollte ich aber verhindern. Das wäre nicht weniger, wenn ich alle Objekte nochmal neu in einer Arrayliste erschaffe.
 
Nein du musst sie nicht neumachen es geht auch:

Rohstoffe stein = new Rohstoffe(0, "Stein", 0, 10, 5);
Rohstoffe eisen = new Rohstoffe(1, "Eisen", 1, 20, 8);

rohstoffliste.add(stein);
rohstoffliste.add(eisen);

Es werden ja eh nur die Referenzen kopiert ;D

P.S.: Hey Misa!
 
Du müsstest die Rohstoffe nur einmal in der ArrayList erzeugen. Wie du richtig erkannt hast, kannst du dann aber nur noch über rohstoffliste.get() auf die Rohstoffe zugreifen. Du musst also wissen, an welcher Stelle welcher Rohstoff steht, oder eine entsprechende Suche einbauen, die dir das ausgibt.
 
Theobald93 schrieb:
Nein du musst sie nicht neumachen es geht auch:

Rohstoffe stein = new Rohstoffe(0, "Stein", 0, 10, 5);
Rohstoffe eisen = new Rohstoffe(1, "Eisen", 1, 20, 8);

rohstoffliste.add(stein);
rohstoffliste.add(eisen);

Es werden ja eh nur die Referenzen kopiert ;D

P.S.: Hey Misa!

Ja das fiel mir dann auch sofort ein :D

Doof ist nur, dass ich ebend jedes mal, wenn ich einen neuen Rohstoff schreibe ich ihn auch in die ArrayList packen muss.

Ich hatte gehofft ich konnte so irgendwie alle Rohstoffe aus der Item-Klasse auslesen.
 
Schreib dir doch einfach eine Methode, die einen Rohstoff erstellt und ihn in die Liste einfügt...

Code:
private Rohstoffe createRohstoff(ATTRIBUTE..., List<Rohstoffe> list) {
  Rohstoffe r = new Rohstoffe(ATTRIBUTE);
  list.add(r);
  return r;
}

//... in der main dann

List<Rohstoffe> rohstoffList = new ArrayList<Rohstoffe>();
Rohstoffe eisen = createRohstoff(1, "Eisen", 1, 20, 8, rohstoffList);

Edit: Noch einen Hinweis zur Benennung der Klasse. Bei Klassennamen bietet es sich immer an, diese im Singular zu benennen, falls sie nur ein einzelnes Objekt, in deinem Fall einen Rohstoff, darstellt. Nur als Tipp für die Zukunft :)
 
Zuletzt bearbeitet:
Wenn das Iterieren oft verwendet wird und kein sequentieller Zugriff notwendig ist, würde ich die Klasse "Items" Iterable implementieren lassen.
 
Iterable sagt mir nichts.

Ich habs jetzt so ähnlich gemacht, wie NiThDi gesagt hat. Vielen Dank allen :)
 
Du hast 2 Möglichkeiten:
* Entweder du gehst - wie oben bereits beschrieben - mit einer Schleife über alle Elemente und rufst für jedes Objekt die sogenannten Getter auf. Das sind öffentliche Methoden, die definiert sein sollten, um auf die einzelnen privaten Attribute zugreifen zu können. Üblicherweise sollten sie getId(), getName(), getStrenth(), etc. heißen.
* Oder du überschreibst die toString() Methode der Rohstoffe-Klasse und lässt dir dort entsprechend die Stringausgabe zusammenbauen. Dann brauchst du nur in einer Schleife der System.out.println() Methode das Objekt zu übergeben und sie wird die toString() Methode von Rohstoffe aufrufen.
 
_Headsh0t_ schrieb:
Iterable sagt mir nichts.

Ich habs jetzt so ähnlich gemacht, wie NiThDi gesagt hat.

Für Dich hier vermutlich nicht relevant, aber dass Du es mal gehört hast: Wenn man keine Kopie der Liste zurück gibt, lässt sich diese von außen manipulieren. Oft möchte man das nicht.

Um das zu verhindern, könnte man im Getter eine Kopie erstellen. Oder aber - wo es ohnehin nur um das Iterieren geht - man liefert keine Liste, sondern gleich einen Iterator. Und dann kann man die Klasse das Iterable-Interface implementieren lassen, um sich einen Methoden-Aufruf beim Tippen zu sparen. Convenience.

Statt

Code:
for (Rohstoff item : items.getItems())

reicht dann

Code:
for (Rohstoff item : items)
 
Zurück
Oben