Bilderbuch Geschrieben 20. Juni 2007 Geschrieben 20. Juni 2007 Hallo zusammen. Ich habe hier einen etwas längeren Text der eigentlich eine relativ kurze Aufgabe darstellt: Definieren Sie eine Klasse Speisekarte, die die Speisekarte eines Restaurants modelliert. Sie soll eine private Instanzvariable namens elemente vom Typ ArrayList von Speise enthalten (Speise ist eine an anderer Stelle definierte Klasse, die die einzelnen Speisen der Speisekarte modelliert.) Eine zweite private Instanzvariable namens nummer soll die Position einer Speise auf der Speisekarte enthalten. Benutzen Sie "Generics", um diese ArrayList zur Verwaltung von Daten des Typs Speise zu verwenden. Ein Konstruktor ohne Parameter soll das ArrayList-Objekt erzeugen und die Variable nummer auf 1 setzen. Eine Methode speiseHinzufügen soll ein Objekt vom Typ Speise als Parameter erhalten und mit Hilfe der ArrayList- Methode boolean add(E o) am Ende der ArrayList abspeichern. Definieren Sie die Klasse Speisekarte so, dass sie die Interfaces Iterator<T> und Iterable<T> implementiert. Das bedeutet (neben der Verwendung des Schlüsselwortes implements), dass Sie die vier Methoden public <T> next(), public boolean hasNext(), public void remove() und public Iterator<T> iterator() fogenderweise implementieren müssen: public <T> next() gibt die jeweils nächste Speise aus der Speisekarte zurück. public boolean hasNext() gibt false zurück, wenn das Ende der Speisekarte erreicht ist. public Iterator<T> iterator() gibt eine Referenz auf das Objekt vom Typ Speisekarte zurück. Die Methode public void remove() soll allerdings keine Speise von der Speisekarte entfernen, sondern eine UnsupportedOperationException auslösen. Benutzen Sie die ArrayList-Methoden E get(int index) und int size(). Und soweit bin ich gekommen bis ich irgendwie auf dem Schlauch stand:import java.util.*; import java.lang.*; public abstract class Speisekarte implements Iterator, Iterable { private ArrayList<Speisen> elemente; private int nummer; /** * Constructor for objects of class Speisekarte */ public Speisekarte() { elemente = new ArrayList<Speisen>(); nummer = 1; } public void speisehinzufuegen (Speisen meineSpeise) { elemente.add (meineSpeise); } public Iterator iterator() { } public Iterator next() { } } import java.util.*; import java.lang.*; public class Speisen { public String Speisen; public Speisen() { Speisen = new String (); } } Kann mir jemand sagen wie es weiter geht? Zitieren
Mohadipe Geschrieben 20. Juni 2007 Geschrieben 20. Juni 2007 Naja ich denke mal hier wird dir keiner den fertigen Quellcode liefern. Da dich das auch nicht wirklich weiterbringt. Kannst du dein Problem etwas genauer beschreiben? Wenn ich den Text so überfliege/durchlese musst du eigentlich nur genau das machen was dort steht -> fertig. Gruß Moha Zitieren
kingofbrain Geschrieben 20. Juni 2007 Geschrieben 20. Juni 2007 Servus, erst mal ein paar kleinere Fehler: - Deine Klasse Speisen soll Speise heißen - Die Methode speiseHinzufügen hat ein großes H und ein ü (das ü ist aber wirklich blöd) Dann fehlen die Methoden hasNext() und remove. Schau Dir einfach die entsprechende Java API Doc der beiden Interfaces an, dann wird die Signatur der Methoden klar. Der Inhalt ist in der Aufgabenstellung ja gut erklärt. Tipp: iterator gibt die eigene Instanz zurück (Stichwort: this). Dann erst mal ein Lob! Du hast bei der Frage hier im Forum fast alles richtig gemacht. Du hast versucht, die Aufgabe selbst zu lösen und bist in Details hängengeblieben. So soll es sein. "Fast", weil Du Deine Ansätze bei den fehlenden Sachen nicht geschrieben hast Schöne Grüße, Peter Zitieren
bigredeyes Geschrieben 20. Juni 2007 Geschrieben 20. Juni 2007 1) du hast noch nicht alle methoden der interface implementiert. 2) deine klasse heißt speise nicht speiseN (n = liste!) 3) generics: class Speisekarte implements iterator<speise>, iterable<speise> 4) warum hast du deine speisekarte als "abstarct" definiert? bigredeyes p.s. nimmst du eclipse? p.p.s. das ü ist aber wirklich blöd ü is mein kumpel und hat viele brüder... also pass auf! Zitieren
Bilderbuch Geschrieben 20. Juni 2007 Autor Geschrieben 20. Juni 2007 1) du hast noch nicht alle methoden der interface implementiert. 2) deine klasse heißt speise nicht speiseN (n = liste!) 3) generics: class Speisekarte implements iterator<speise>, iterable<speise> 4) warum hast du deine speisekarte als "abstarct" definiert? p.s. nimmst du eclipse? zu 1: Stimmt ich habe boch nicht alles implementiert. Das sollte jetzt noch efolgen. zu 2: Auch richtig aber da durchweg so ncith so tragisch außer vielleicht die Aufgabenstellung verfehlt zu 3 u 4: Da ich die generics beim implements ... vergessen hatte mochte der compiler nur eine abstract class. Blöder Fehler. Noch kurz zum großen H und dem ö. Im Quelltext habe ich das nicht verwendet steht nur so in der Aufgabenstellung. Nutze BlueJ. Unser Leher fährt da voll drauf ab... Ist nicht so der Wahnsinn... Zitieren
Bilderbuch Geschrieben 20. Juni 2007 Autor Geschrieben 20. Juni 2007 So nach einigen Versuchen und Erweiterungen schaut es nun so aus: Hoffe es wird nicht zu lang.... public class Speisekarte implements Iterator<Speisen>, Iterable<Speisen> { private ArrayList<Speisen> elemente; private int nummer; public Speisekarte() { elemente = new ArrayList<Speisen>(); nummer = 1; } public void speisehinzufuegen (Speisen meineSpeise) { elemente.add (meineSpeise); } public Iterator iterator() { return this.elemente.iterator(); } public Speisen next() { return this.next(); } public boolean hasNext() { return this.hasNext(); } public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } } public class Speisen { public String Speisen; public String name; public boolean istvegetarisch; public int preis; public Speisen(String name, boolean istvegetarisch, int preis) { this.name = name; this.istvegetarisch = istvegetarisch; this.preis = preis; Speisen = toString(name, istvegetarisch,preis); } private String toString(String name, boolean istvegetarisch, int preis) { String spass; String vegi; if (istvegetarisch == true) { vegi = "Vegetarisch"; } else { vegi = "mit Fleisch"; } spass = name + " " + vegi + " " + new Integer(preis).toString(); return spass; } } public class SpeisekartenAnzeigen { private Speisekarte Karte; private Speisen hunger; public SpeisekartenAnzeigen() { Karte = new Speisekarte(); hunger = new Speisen ("Fleischsalat", false, 4); Karte.speisehinzufuegen(hunger); hunger = new Speisen ("Schinkenpizza", false, 3); Karte.speisehinzufuegen(hunger); hunger = new Speisen ("Chefsalat", true, 2); Karte.speisehinzufuegen(hunger); for (Karte.iterator(); Karte.hasNext() { System.out.println(Karte.next()); } } public static void main ( String arg[] ) { new SpeisekartenAnzeigen(); } }[/code] Ich habe noch das Problem die hasNext() und next() in der Speisekartenklasse zu implementieren. Bekomme im moment immer einen StackOverflow Der Rest ist etwas Spagetticode aber läuft. Zitieren
kingofbrain Geschrieben 20. Juni 2007 Geschrieben 20. Juni 2007 Du rufst in den zwei Methoden jeweils immer die gleiche Methode auf - rekursiv. Irgendwann ist der Stack voll und Du kriegst die Exception. Du willst aber das Ergebnis des Aufrufs der Methode next() und hasNext() des Iterators Deiner enthaltenen ArrayList zurückgeben bzw. evtl. selbst einen aktuellen index halten und diesen auswerten bzw. zurückliefern. Wichtig ist, die Grenzen der ArrayList zu beachten. Also: eigener Index mit 0 initialisiert. hasNext(): nachschauen, ob es beim aktuellen Index noch einen nächsten in der ArrayList gibt und Ergebnis zurückliefern. Bei next() ebenso. Peter Zitieren
Bilderbuch Geschrieben 20. Juni 2007 Autor Geschrieben 20. Juni 2007 Danke! So die Exception ist erledigt. public Speisen next() { Speisen erg = elemente.get(index); index++; return erg; } public boolean hasNext() { int size = elemente.size(); if ( index < size ) { return true; } else { return false; } } Jetzt bekomme ich nur noch als Konsolenausgabe eine Referenz auf ein Speisenobjekt (denke ich). Aber nicht den gewünschten String???? Zitieren
kingofbrain Geschrieben 21. Juni 2007 Geschrieben 21. Juni 2007 Du hast ja scheinbar eine Membervariable index, das ist in Ordnung. Du solltest allerdings in next() auch die Bereichsgrenzen Deiner ArrayList abprüfen, sonst läufst Du irgendwann in eine ArrayIndexOutOfBoundsException. Und Deine boolean-Geschichte in hasNext() kannst Du vereinfachen: return index < size; Was willst Du denn für einen String? Irgendwas aus dem Speise-Objekt (btw, nenn das mal um, die Klasse repräsentiert keine mehrere Speisen, sondern eine Speise)? Dann hol es Dir doch - normalerweise mit dem entsprechenden getter. Peter Zitieren
Bilderbuch Geschrieben 21. Juni 2007 Autor Geschrieben 21. Juni 2007 Ok Danke. Werde es heute Abend testen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.