Erste Schritte Was bedeutet dieser Code?

Devanther

Top Contributor
Code:
public void simuliereEinenSchritt()
    {
        schritt++;
      
        // Platz für neugeborenes Tier anlegen.
        List<Tier> neueTiere = new ArrayList<Tier>();
        // Alle Tiere agieren lassen.
        for(Iterator<Tier> iter = tiere.iterator(); iter.hasNext(); ) {
            Tier tier = iter.next();
            tier.agiere(neueTiere);
            if(!tier.istLebendig()) {
                iter.remove();
            }
        }
      
        // Neugeborene Füchse und Hasen in die Hauptliste einfügen.
        tiere.addAll(neueTiere);

        ansicht.zeigeStatus(schritt, feld);
    }

Kann mir jemand bitte erklären, was die for Schleife macht?
Auf der Liste tiere wird die Methode iterator() aufgerufen, was machst sie?
Was bedeutet iter.hasNext();?
Was bedeutet iter.next();?

Und nach der for-Schleife heisst es, tiere.addALL....was wird hier gemacht?
Die Klasse Tier hat gar keine Methode addAll...

Dieser Code ist vom Projekt, Füchse und Hasen Simulation von BlueJ.
Leider verstehe ich nicht was in der Methode oben gemacht wird.
 
Auf der Liste tiere wird die Methode iterator() aufgerufen, was machst sie?
Die Methode gibt einen Iterator zurück, mit dem man über Dinge, in diesem Fall die Liste, iterieren kann, indem man jeweils das nächste Element abfragt.

Was bedeutet iter.hasNext();?
hast du das mal übersetzt? 😉
Was bedeutet iter.next();?
Und das auch? 😉

Und nach der for-Schleife heisst es, tiere.addALL....was wird hier gemacht?
Die Klasse Tier hat gar keine Methode addAll...
tiere ist, wie du selbst gesagt hast, eine Liste von Tieren.
Was könnte wohl ein addAll mit einer Liste machen?
 
Auf der Liste Tiere wird die Methode iterator() aufgerufen, die einen Iterator zurückgibt.
Es wird ein Iterator zurückgegeben und in der Variablen "iter" gespeichert.

Und der prüft mit der Methode .hasNext() ob es weitere
Elemente gibt. Wenn es weitere Elemente gibt, wird true zurückgegeben.
Mit der Methode next() wird jedes Element(Tier) durchlaufen und
darauf wird die agiere() Methode aufgerufen?
Wenn das Tier tot ist, wird es aus dem Iterator entfernt.

Ist das so richtig?
 
Code:
public TeleporterRaum(Raum... raeume) // var args = variable anzahl von Argumenten
    {
        //raeume ist ein Array
        super("in einem Teleporterraum");
      
        for(int i = 0 ; i < raeume.length; i++){
            ausgaenge.put(String.valueOf(i),raeume[i]);  // String.valueOf(i) liefert i als String zurück
        }
      
    }

Was bedeutet folgende Zeile: ausgaenge.put(String.valueOf(i),raeume); ?
Mit super wird der Konstruktor der Superklasse Raum aufgerufen und eine Beschreibung wird übergeben.
Raum... raeume hier werden beliebig viele Räume übergeben, die alle vom
Typ Raum sein müssen?
raeume ist ein Array.


Code:
private Raum findeZufaelligenRaum()
    {
      
        List<String> keys = new ArrayList<>(ausgaenge.keySet()); //Diamond Operator
        Random random =  new Random();
        int zufaelligerIndex = random.nextInt(ausgaenge.size());
        Raum zufaelligerRaum = ausgaenge.get(keys.get(zufaelligerIndex));
        return zufaelligerRaum;
    }

ausgaenge.keySet() was passiert hier?
ausgaenge.get(keys.get(zufaelligerIndex)); was passiert da?

Das ist der Code von einem Spiel.
Wenn man den TeleporterRaum verlässt wird man in einen zufällig ausgewählten Raum gebeamt.
 
Zuletzt bearbeitet:
Hast du mal geguckt, was ausgaenge für ein Typ ist, und was die Methode put macht?

Welcher Typ ist denn ausgaenge? Die Methode put verknüpft den Wert mit dem Schlüssel?
Laut API: Associates the specified value with the specified key in this map
ausgaenge.put(String.valueOf(i),raeume);
verstehe ich leider nicht -.-

Auch hier: Mal nachgeguckt, was in der Doku steht? Die Methoden sind ziemlich leicht...

Ich verstehe die Doku nicht ganz.
Was macht die Methode keySet?
 
ausgaenge ist eine HashMap, die sich in der Superklasse befindet.
protected HashMap<String, Raum> ausgaenge;
In der Unterklasse greifen wir darauf zu.

Mit der Methode put tun wir einen String und einen Raum in die HashMap. (Schlüssel/Wert) / (Keys/Values)
Über den String kann man auf den Raum zugreifen.
Mit der Methode .keySet() holen wir aus der HashMap die Keys und das wird in der Variablen keys gespeichert.

Und später holen wir mit der Methode keys.get() die Keys die in der Variablen zufaelligerRaum gespeichert und
zurückgegeben werden.

Ist das richtig?
Ich glaube ich habe die Funktion einer HashMap immer noch nicht richtig verstanden.
ausgaenge.get() was macht diese Methode?

 
get(Object key) holt einen Wert zu dem der Schlüssel bekannt ist.

Bei einer HashMap macht es (fast) keinen Unterschied, ob nur ein Element gespeichert wird oder ob eine Millarde Elemente gespeichert werden. Ein Wert (von dem der Schlüssel bekannt ist) kann also superschnell gefunden werden.

Als Schlüssel verwendet man typischerweise eine ID.
Außerdem gibt es keine feste Reihenfolge wie z.B. bei einer ArrayList. Bei HashMap und auch bei HashSet gibt es keine Indizes. Zudem kann es in einer Hashmap und in einem HashSet keine doppelten Einträge geben.

Einen Index gibt es nicht. Deshalb wird in deinem Beispiel das Set mit den Schlüsseln in einer ArrayList hinterlegt. Dort gibt es Indizes und deshalb kann man einen Zufallszahlengenerator anwenden.
 
Zuletzt bearbeitet:
Code:
package paket1;


import java.util.HashMap;

public class HashMapDemo {
    private static HashMap<String, ObjektDemo> hm2;
    public static void hashMapTest(){
        hm2 = new HashMap<String, ObjektDemo>();
        hm2.put("1", new ObjektDemo("Jack",20));
        hm2.put("2", new ObjektDemo("Mark",22));
        hm2.put("3", new ObjektDemo("Steffie",20));
        hm2.put("4", new ObjektDemo("Olga",19));
        for(ObjektDemo demo : hm2.values()){
            demo.printWerte();
        }
        ObjektDemo o = hm2.get("1");
        o.printWerte();
    }
        public static void main(String[] args) {
        hashMapTest();
    }
}

Code:
package paket1;

public class ObjektDemo {
    
    private String name;
    private int alter;
    public ObjektDemo() {
    }
    public ObjektDemo(String nameK , int alterK) {
        this.setName(nameK);
        this.setAlter(alterK);
    }
    public void setName(String name){
        this.name = name;       
    }
    public void setAlter(int alter){
        this.alter = alter;       
    }
    public void printWerte(){
        System.out.println("Name "+name+", Alter "+alter+".");
    }
}

Hier gibt es auch in einer HashMap eine Reihenfolge auf die man zugreifen kann!
 
Da bedeutet aber nicht, dass das Key-Value-Paar in der Map an Stelle 1 steht. Du sagst ja nicht "gib mir das erste Element" sondern "gib mir den Value zum Key "1"".
 
Code:
private Position findeNahrung()
    {
        Feld feld = gibFeld();
        List<Position> nachbarPositionen =
                               feld.nachbarpositionen(gibPosition());
        Iterator<Position> iter = nachbarPositionen.iterator();
        while(iter.hasNext()) {
            Position pos = iter.next();
            Object tier = feld.gibObjektAn(pos);
            if(tier instanceof Hase) {
                Hase hase = (Hase) tier;
                if(hase.istLebendig()) {
                    hase.sterben();
                    futterLevel = HASEN_NAEHRWERT;
                    return pos;
                }
            }
        }
        return null;
    }

if(tier instanceof Hase) {
Hase hase = (Hase) tier;

Ich wollte fragen, was da gemacht wird.
Wenn tier = Hase ist oder
tier = Unterklasse von Hase wird true zurückgeliefert.
Es wird geprüft ob Hase eine Instanz von tier ist.
Ist das richtig?
Was passiert danach?
Ist das eine Typumwandlung? Hase wird in tier umgewandelt?
Ich verstehe den Sinn dahinter nicht.
 
if(tier instanceof Hase) {
Hase hase = (Hase) tier;


Kann mir jemand das erklären?
Wird geprüft ob Hase eine Instanz von tier ist oder umgekehrt?
Im Buch steht, dass tier = Hase sein müsste...aber eigentlich muss es doch umgekehrt sein, dass
Hase tier ist. tier ist ja die Superklasse.
 
Java:
Object tier = feld.gibObjektAn(pos);
if(tier instanceof Hase) {
Hase hase = (Hase) tier;

Zum Erklären ist noch die Zeile darüber wichtig.
Egal was bei feld.gibObjektAn(pos) passiert, das Objekt tier kann nur die Methoden, welche die Klasse Object kann (toString() etc.). Auch wenn feld.gibObjektAn(pos) eine Instanz der Klasse Hase zurückgibt. Wir müssen es also Casten, das passiert in der letzten Zeile. Das Objekt hase kennt nun alle Methoden der Klasse Hase, da wir den Datentyp von Object auf Hase umgewandelt haben. Das funktioniert aber nur, wenn das Objekt tier auch wirklich von der Klasse Hase (oder einer davon erbendenden Klasse) ist. Deswegen die instanceof-Abfrage. Wenn diese Abfrage wahr ist, wissen wir sicher, dass tier von der Klasse Hase ist, so dass beim Cast auch kein Laufzeitfehler auftreten kann.
 

Zurück
Oben