Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID

Mika34

Bekanntes Mitglied
Hallo an alle,

Ich bin momentan wieder an einem Punkt, an dem ich nicht weiterkomme. Es handelt sich hierbei um das Entfernen von Objekten. An einem Beispiel sieht das so aus:
erstes Objekt: Farbe: schwarz, Länge: 2, ID: 1
zweites Objekt: Farbe:gelb, Länge: 5, ID: 2
drittes Objekt: Farbe: grün, Länge: 7, ID: 3

Wenn ich nun das zweite Objekt entferne bleibt dies übrig:
erstes Objekt: Farbe: schwarz, Länge: 2, ID: 1
drittes Objekt: Farbe: grün, Länge: 7, ID: 3

Füge ich nun ein, theoretisch gesehen, viertes Objekt hinzu, dann muss die Liste so aussehen:
erstes Objekt: Farbe: schwarz, Länge: 2, ID: 1
drittes Objekt: Farbe: grün, Länge: 7, ID: 3
viertes Objekt: Farbe: lila, Länge: 3, ID: 2

Es geht hier im Allgemeinen darum, dass ich Objekte mit einer eindeutigen ID beginnend ab 1 in einer Liste speichere. Entferne ich eines dieser Objekte, dann muss das nächste hinzugefügte Objekt die nun freigegebene ID (hier im Beispiel die ID: 2) übernehmen. Danach wird dann ganz normal weitergezählt.

Meine Überlegung war, die addObject, also die Methode mit der ich Objekte der Liste hinzufüge, zu verändern, jedoch scheitere ich momentan daran und fürchte, dass dies der falsche Weg ist. Falls dies der richtige Weg ist oder ein anderer Weg besser wäre, bin ich über jede Hilfe tierisch dankbar 🙂

Beste Grüße
 
Hast du bereits Code, mit dem du z.B. die Liste aus dem Beispiel erzeugst?
Java:
public class Coach {
    protected static int invoiceCounter = 1;
    protected int length;
    protected int definiteId;
    protected boolean coupingFront;
    protected boolean couplingBack;


}

public class FreightCoach extends Coach {
    
    public FreightCoach(String carriageType, int length, boolean couplingFront, boolean couplingBack) {
        this.carriageType = carriageType;
        this.length = length;
        this.coupingFront = couplingFront;
        this.couplingBack = couplingBack;
        this.definiteId = invoiceCounter++;
        this.isConnectedToTrain = false;

    }
}

public class Manager{
    private ArrayList<Coach> allCoaches = new ArrayList<>();


    public void createCoach(String carriageType, int length, boolean couplingFront, boolean couplingBack) {
    Coach freightCoach = new FreightCoach(carriageType, length, couplingFront, couplingBack);
    allCoaches.add(freightCoach);
    }
}

So sieht es bei mir jetzt aus. Die ID wird jedes mal wenn ein Objekt hinzugefügt wird, um eins hochgezählt, aber ich bekomme es nicht auf die Kette, wenn man ein Objekt aus der Liste entfernt, mit dieser ID vom entfernten Objekt das neu erzeugte Objekt zu erzeugen.
 
Also ehrlich gesagt entspricht das auch nicht so ganz meinem Verständnis von einer id. Warum muss denn die gelöschte id ersetzt werden? Gibt es dafür einen wirklich wichtigen Grund?
 
Ansonsten packe eine Funktion in den Manager getNextId().

Die sucht aus allen Coaches (die kennt der Manager ja) die nächste freie Id.
Die Id wird dann mit im Konstruktor übergeben des Coaches übergeben. (Sofern du Multithreading nutzt, musst du aber aufpassen, das keine IDs doppelt vergeben werden)

Grundsätzlich stimme ich Thallius zu - eine Id sollte eindeutig sein und nicht neu vergeben werden. Lücken sind bei Ids vollkommen normal.

Wenn du wie hier die Anforderung hast, dass die ID von den bereits existierenden IDs der anderen Coaches abhängt, dann kann sie nicht mehr im Konstruktor eines Coaches direkt erzeugt werden. Entweder muss sie übergeben werden oder eine Strategie zur Erzeugung muss übergeben ewrden.
 
Also ehrlich gesagt entspricht das auch nicht so ganz meinem Verständnis von einer id. Warum muss denn die gelöschte id ersetzt werden? Gibt es dafür einen wirklich wichtigen Grund?
Diese Frage habe ich mich auch schon gestellt, aber die Übungsleitung verlangt diese Eigenschaft, also muss man diese dann auch implementieren...
Long story short: Ich denke, dass die Id's einheitlich sein sollen und keine Sprünge zwischen den Ids herrschen sollen
 

Zurück
Oben