Verknüpfung von Räumen mit Hashset

WIstud2015

Mitglied
Hallo zusammen,

ich sitze gerade einer einer Aufgabe bei der Räume wie kitchen, dining room etc. mit Türen verbunden werden sollen. Dabei darf jeder Raum nur eine Tür zu einem anderen Raum haben (z.B. Kitchen zu Dining Room), aber beliebig viele Türen in verschiedene Räume ( also z.B. kitchen in dining Room und kitchen in living room.

Es gibt eine Klasse, die das Ganze testen, also Räume hinzufügt und entfernt bzw. prüft, ob es Verbindungen gibt.

Diese Klasse greift auf die Klasse Room zu, welche die Methoden enthält( Siehe Code).
Wenn ein Raum bereits eine Tür hat, soll die Methode addDoorInto(Room r) ohne Wirkung bleiben. Deshalb war meine Idee das per Hashset zu lösen, da dann doch ein Element nur einmal vorkommen kann ?!

Mein Problem ist jetzt, dass ein Raum zwar hinzugefügt wird, aber laut der Aufgabe der andere Raum, mit dem die Verbindung besteht auch in der Liste sein muss.

Beispiel:
kitchen.addDoorInto(diningRoom)

Dann hat kitchen eine Verbindung zum dining Room, aber nach jetzigem Stand nicht umgekehrt. Ich stehe da etwas auf dem Schlauch.

Hat jemand vielleicht eine Idee, wie man das am einfachsten lösen kann ?

Vielen Dank!

Java:
import java. util.HashSet;

/**
* A room may be connected to other rooms with one door each.
*/
public class Room {
    HashSet<Room> doors = new HashSet<Room>();
    /**
     * Adds a door into a specific room r. If a door to r already
     * exists, this function has no effect.
     * @param r The room to be connected.
     */
    public void addDoorInto(Room r) {
        doors.add(r);
       
    }
    /**
     * Removes the door into a specific room r. If no door to r exists,
     * this function has no effect.
     * @param r The room to be disconnected.
     */
    public void removeDoorInto(Room r){
        doors.remove(r);
       
    }

    /**
     * Checks if a connection via a door exists.
     * @param r The room the connection is checked to.
     * @return Returns true if a door into room r exists. Otherwise returns false.
     */
    public boolean hasDoorInto(Room r) {
        if(doors.contains(r)){return true;}
        return false;
    }
}
 
Die Anforderung ist doch ziemlich komisch. Darf die Küche jetzt eine oder zwei Türen haben?!

Türen sind von ihrer Natur aus Bidirektional. Wenn zwei Türen in einen Raum hinein führen, führen auch zwei wieder raus.
 
Die Küche darf so viele Türen haben wie nötig, aber nur eine ins z.B. Wohnzimmer.

So stehts im Aufgabentext:
Ein Raum soll Türen zu beliebig vielen anderen Räaumen erhalten. Jedoch soll zu jedem
Raum nur maximal eine Tür existieren.
 
Ich verstehe die Aufgabenstellung nicht. Wenn man von der Küche und vom Flur ins Wohnzimmer kommt, kommt man auch vom Wohnzimmer in die Küche und in den Flur. Entweder ist da was mit der Aufgabenstellung schief oder ich stehe mächtig auf dem Schlauch....

Edit: Ich glaub jetzt hab ichs verstanden 😀 Zwei Räume dürfen nur durch eine Tür verbunden sein. Stimmt das so?
 
Ja, von der Logik schon. Aber so wie ich das jetzt mit der Add Methode gelöst habe, gibt es einen Fehler bei der zweiten Assert Abfrage.


assert kitchen.hasDoorInto(diningRoom) == true
: "The kitchen should now have a door to the dining room.";
assert diningRoom.hasDoorInto(kitchen) == true
: "If the kitchen has a door to the dining room, the dining room should have a door to the kitchen, too.";
 
Bei deinem oben gezeigten Code-Ausschnitt weiß jeder Raum, wo er Türen hin hat. So besteht eine Verbindung in eine Richtung. Wenn also eine Verbindung erstellt werden soll, müsstet du die Methode addDoorInto zwei Mal aufrufen, damit jeder Raum einen Eintrag in seinem HashSet bekommt. Der erste Aufruf speichert im Raum A die Verbindung zu Raum B und der zweite Aufruf bildet den Rückweg.
 
Deine Lösung könnte so funktionieren; die hasDoorInto(Room) Methode kannst du aber vereinfachen: return doors.contains(room);

Wie Bitfehler schon sagte gibts da jetzt aber ein Problem: wenn man kitchen.addDoorInto(livingRoom) aufruft, muss danach livingRoom.hasDoorInto(kitchen) true zurückgeben (Türen sind ja bidirektional). Deshalb würde ich die hasDoorInto(Room) Methode so implementieren:

Java:
public boolean hasDoorInto(Room room) {
    return doors.contains(room) || room.doors.contains(this);
}
 
Sehr cool. Man muss allerdings noch die add und remove Methode anpassen, weil sonst beim Entfernen der Tür ein Assert anschlägt. So klappt es jetzt:

Java:
import java. util.HashSet;

/**
* A room may be connected to other rooms with one door each.
*/
public class Room {
    HashSet<Room> doors = new HashSet<Room>();
    /**
     * Adds a door into a specific room r. If a door to r already
     * exists, this function has no effect.
     * @param r The room to be connected.
     */
    public void addDoorInto(Room r) {
        doors.add(r);
        r.doors.add(this);
       
    }
    /**
     * Removes the door into a specific room r. If no door to r exists,
     * this function has no effect.
     * @param r The room to be disconnected.
     */
    public void removeDoorInto(Room r){
        doors.remove(r);
        r.doors.remove(this);
       
    }

    /**
     * Checks if a connection via a door exists.
     * @param r The room the connection is checked to.
     * @return Returns true if a door into room r exists. Otherwise returns false.
     */
    public boolean hasDoorInto(Room r) {
        //if(doors.contains(r)){return true;}
        //return false;
           return doors.contains(r) || r.doors.contains(this);
       
    }
}

Vielen Dank für die Hilfe !
 
Wenn Du die Tür in beiden Räumen einsetzt und auch in beiden Räumen entfernst, dann musst Du nicht mehr bei der Prüfung beide Räume prüfen!
 

Neue Themen


Zurück
Oben