Damit obige Funktion funktioniert, brauchst du das Objekt selber, nicht seinen "Namen". Es gibt aber auch ein remove, das mit dem Index arbeitet, womit du also das nullte, erste, zweite Element löschen kannst.
'den Namen des Objektes angebe'
ein Objekt hat standardmäßig keinen Namen, insofern ist das alles recht undeutlich,
noch komplizierter wirds, wenn gar eine ganze Klasse Name heißt,
ein komplettes Beispiel-Programm mit der Klasse Name wäre günstig,
allgemein:
erstelle ein Dummy-Objekt Name mit dem richtigen Inhalt,
implementiere die equals-Methode korrekt, so dass gleiche Objekte erkannt werden
und rufe dann remove(neues Name-Objekt) auf
-> Effekt: entfernt maximal ein Objekt aus der Liste, welches zu dem übergebenen Objekt equal ist
wenn Name equals und hashCode sauber überschreibt, sollte remove funktionieren.
zB equals sind zwei Name, wenn der Objektame (was auch immer) gleich sind
oh.... da hab ich wohl nicht als erster die Aufgabenstellung mit einer Cocktailbar bekommen. Danke für den Link. Würde mich trotzdem über hilfe Freuen, da es nicht im Sinne des Erfinders ist Fremden Code zu übernehmen.
Code:
import java.util.ArrayList;
import Prog1Tools.IOTools;
public class Cocktailbar implements BarService {
public Cocktailbar() {
/** Collections for various numbers of Receipes */
ArrayList<Recipe> recipeslist = new ArrayList<Recipe>();
}
public void add(Recipe recipe) throws CocktailException {
while (true) {
// Insert Recipeename
String entryRecipe = IOTools.readLine("Name of the Recipe (<ENTER> to finish)");
if (!entryRecipe.equals("")) {
recipe.add(recipe);
} else {
break;
}
}
}
public void remove(Recipe recipe) {
String removeEntry = IOTools.readLine("Name of the Recipe which should be remove)");
if (!removeEntry.equals(recipe)) {
this.removeEntry.remove(recipe);
} else {
break;
}
}
}
ein String kann nie equal zu einem Nicht-String sein
und was soll
> this.removeEntry.remove(recipe);
bedeuten?
this macht nur bei Klassenattributen Sinn, es gibt kein Attribut removeEntry?
von der lokalen Variable vom Typ String könnte man nichts removen, nur von ArrayLists,
der Parameter recipe, der da entfernt wird, hat übrigens nichts mit dem eingelesenen String zu tun
auch sonst:
ein break im else-Fall??
im Konstruktor ist eine lokale Variable recipeslist definiert, aber kein Klassenattribut
recipe.add(recipe);
klingt auch gewagt, etwas sich selber hinzufügen
bitte nochmal in einem Lehrbuch ganz vorne anfangen..
(sorry bei manchen Postings muss ich so antworten )
Wie auch schon im anderen Thread sollte der Kontrollfluss nicht im add sein. Sonst kommste da ja nimmer raus aussert mit dem hässlichen break.
add und remove machen genau 1 Sache --> Nomen est omen....
rezepte adden und removen...ein 1 zeiler um genau zu sein.
oder drei Zeiler wenn noch ein contains abgefragt wird
(siehe L-ectron-X oder dich selber)
IOTools...mir wird schlecht...aber nun gut...
gehört alles in eine Hauptschleife...Der Kontrollfluss des Programms so Ca:
was willst du? (add/remove)
add
Was wollen sie adden?
Bier.
Oh...eine gute Wahl. Bier wurde hinzugefüt.
Also das ist ziemlich daneben. Ich sehe zwei Lösungsmöglichkeiten:
- Entweder Recipe hat ein String Member für seinen "Namen"
- oder du verwendest eine Map, bei der die Namens-Strings auf Recipes verweisen
Die Datenstruktur, die du verwendest (sei es nun eine Liste oder eine Map), muss übrigens als Member-Variable gespeichert werden. Man kann sie im Konstruktor initialisieren, aber nicht definieren, denn dann hat man später keinen Zugriff drauf.
Mal ein Versuch mit der Map-Variante (aus'm Kopp - ohne Gewähr):
Code:
import java.util.*;
public class Cocktailbar implements BarService {
private Map<String, Recipe> recipes = new HashMap<String, Recipe>();
public void add(Recipe recipe) throws CocktailException {
String name = IOTools.readLine("Name of the Recipe (<ENTER> to finish)");
if (! name.equals("") && ! recipes.contains(name)) {
recipes.put(name,recipe);
}
}
public void remove() {
String name = IOTools.readLine("Name of the Recipe which should be remove)");
recipes.remove(name);
}
public Recipe get() {
String name = IOTools.readLine("Name of the Recipe which should be used)");
recipes.get(name);
}
//mal als Test
public void printAllRecipeNames() {
for(String name: recipes.keyset()) {
System.out.println(name);
}
}
}
Ganz nebenbei solltest du dir auch überlegen, ob du die Funktionalität nicht in zwei Klassen verteilst: Eine für die Ein- und Ausgabe und so, und die Cocktailbar nur für die Verwaltung der Recipes (dann würdest du dort einfach nur die Namen übergeben, statt diese selbst zu lesen). Der jetzige Mix von zei Aufgaben (I/O und Recipeverwaltung) ist schlechter Stil - Stichwort "Separation of Concerns"