String und Klassenvariable

  • Themenstarter Themenstarter David Nienhaus
  • Beginndatum Beginndatum
D

David Nienhaus

Gast
Hallo, ich habe folgendes Problem:

Es geht um ein sehr simples textbasiertes Spiel mit Räumen und Gegenständen.
Ich habe eine Arraylist, welche Gegenstände beinhaltet. Gegenstand ist eine eigene Klasse mit, unter anderem, einem String Bezeichnung als Attribut.
In einer früheren Version habe ich die Gegenstände einfach als Strings in einem Array gespeichert. Jetzt wollte ich ihnen aber verschiedene Attribute geben, deshalb die eigene Klasse.

Jetzt möchte ich innerhalb einer Methode überprüfen, ob ein bestimmter Raum einen Gegenstand enthält. Das Problem ist jetzt nur, dass das Spiel so abläuft, dass man immer ein oder zwei Befehlswörter eingibt wie zum Beispiel: go north, inspect room oder take banana. Diese Strings habe ich in der früheren Version einfach genommen und geschaut ob sie in der Arraylist enthalten sind. Da die Arraylist jetzt allerdings Gegenstände und keine Strings enthält
geht das natürlich nicht mehr.
Jetzt würde ich gerne wissen, ob ihr eine elegante Methode kennt, wie ich zum Beispiel wenn banana eingegeben wurde meine Gegenstands Arraylist nach Gegenständen mit der Bezeichnung banana durchsuche. Ich habe erst überlegt ein Hilfsgegenstand zu erzeugen, aber dann habe ich ja einen weiteren Gegenstand der herumirrt ...

Code:
private void nimmGegenstand(Befehl befehl)
    {
       if(!befehl.hatZweitesWort()) // wenn kein zweites Befehlswort eingegeben wurde 
       {
            System.out.println("Was möchten Sie nehmen?");
            return;
        }
       
       //Gegenstand gegenstand = new Gegenstand(befehl.gibZweitesWort());

       if (aktuellerRaum.enthältGegenstand(gegenstand)) 
       {
           aktuellerSpieler.setzeInventar(gegenstand);
           aktuellerRaum.entferneInhalt(gegenstand);
        }
       
       else {
           System.out.println("Dieser Gegenstand existiert nicht");
        }
    }

Code:
public boolean enthältGegenstand(Gegenstand bezeichnung)
    {
        return inventar.hatGegenstand(bezeichnung);
    }

Code:
public boolean hatGegenstand(Gegenstand bezeichnung)
   {
     if (inventarListe.contains(bezeichnung))
     return true;
     else
     return false;
   }
 
Du hast jetzt eine List mit Gegenständen: List<Thing> things. Jetzt kannst du aber über diese Iterieren und den Namen erfragen:
Java:
public Thing getByName(List<Thing> things, String name) {
  for (Thing thing : things) {
    if (thing.getName().equals(name)) {
      return thing;
    }
  }
  return null;
}
Dann hast du das Ding gefunden und kannst damit weiterarbeiten.
 
Ich habe das ganze jetzt folgendermaßen auf meinen Code angepasst :

Code:
public boolean hatGegenstand(String  bezeichnung) {
    for (Gegenstand gegenstand : inventarListe)
    {
       if (gegenstand.gibBezeichnung().equals(bezeichnung))
       {
           return true;
       }
    }
    return false;
   }

Was genau macht die Zeile for (Gegenstand gegenstand : inventarListe)?
Bzw. was macht der Doppelpunkt?
 
https://docs.oracle.com/javase/8/docs/technotes/guides/language/foreach.html
Das ist eine "Enhanced-For Loop" oder auch "For-Each Loop/Schleife" genannt.
Effektiv macht die verallgemeinerte Schleife:
Java:
for (T e : iterable) {
  s;
}
folgendes:
Java:
Iterator<T> it = iterable.iterator();
while (it.hasNext()) {
  T e = it.next();
  s;
}
Es ist einfach eine Iteration über den durch das zu iterierende Objekt per java.lang.Iterable.iterator() zurückgelieferten java.util.Iterator.
(Hinweis: java.util.ArrayList implementiert java.lang.Iterable)
 

Zurück
Oben