Wie füge ich eine Liste so in eine andere Liste ein, dass der Index der Elemente derselbe bleibt?

Anfaengerin

Aktives Mitglied
Wie füge ich eine Liste so in eine andere Liste ein, dass der Index der Elemente derselbe bleibt?
wenn ich z.B. der Liste haus (die bisher 100 Werte null hat) die Liste zimmer hinzu, sodass zimmer(9)=haus(9)
Geht das mit der addAll-Methode? haus.addAll(0, zimmer)?
 
Ich bin mir nicht ganz sicher was du brauchst, aber nehmen wir mal folgendes Beispiel:

Code:
      1     2
---|------|---
0:   null   A
1:   null   B
2:   null   C
3:   null   D
4:   null
5:   null
6:   null
7:   null
8:   null
9:   null

Wenn du jetzt Liste 2 in 1 einfuegen willst, musst du die Elemente vorher loeschen:

Java:
// Loeschen der Anzahl der Elemente aus list2 welche eingefuegt werden.
for (int counter = 0; counter < list2.size(); counter++) {
    list1.remove(0);
}

// list2 am Afang einfuegen.
list1.addAll(0, list2);

Code:
      1     2
---|------|---
0:    A     A
1:    B     B
2:    C     C
3:    D     D
4:   null
5:   null
6:   null
7:   null
8:   null
9:   null

Wenn du hingegen nur nicht null Werte uebernehmen willst:

Code:
      1     2
---|------|---
0:    F     null
1:    G     null
2:    H     null
3:   null   A
4:   null   B
5:   null   C
6:   null   D
7:   null
8:   null
9:   null

Java:
// Iterieren ueber alle Elemente in list2.
for (int index = 0; index < list2.size; index++) {
    // Holen des Werts aus list2.
    Object value = list2.get(index);
    
    // Wenn dieser nicht null dann einfuegen am aktuellen Index.
    if (value != null) {
        list1.remove(index);
        list1.add(index, value);
    }
}

Code:
      1     2
---|------|---
0:    F     null
1:    G     null
2:    H     null
3:    A      A
4:    B      B
5:    C      C
6:    D      D
7:   null
8:   null
9:   null

Am einfachsten ist wenn du mal aufzeichnest/erklaerst welche beide Listen du hast, und wie diese aufeinander vereinigt werden sollen.
 
Das klingt erst einmal alles recht dubios. Aber evtl. ist das Thema auch nicht richtig rÄuber gekommen.

1. Wenn Du eine Liste mit Häusern hast, dann macht es wenig Sinn, da lauder null Werte zu haben. Das klingt etwas, als wäre da die die Arbeitsweise von Arrays einfach auf die Arbeitsweise mit dynamischen Listen übertragen worden.
2. Wenn der Index so wichtig ist, dann klingt das etwas danach, dass es eigentlich ein Teil der Daten sein müsste. Du hast also eine Klasse, die dann ein Feld id hat oder so. Dadurch hast Du die Daten gekapselt und Du verlierst keine wichtigen Daten nur durch simple Verwaltungsdinge (wie das Löschen oder hinzufügen von Elementen).
3. Du hast eine L:iste mit Häusern und dann weist Du da Zimmer zu? D(Das kann natürlich Sinn machen, aber prinzipiell klingt es erst einmal dubios.)

Also etwas zusammen gefasst: ich hätte hier mehr einen objektorientierten Ansatz erwartet, der Daten sauber kapselt und auch klar zwischen Typen unterscheidet.

Aber unabhängig davon, musst Du nicht Elemente entfernen um die neuen einzufügen. List::set überschreibt ein Element an einem index:
Replaces the element at the specified position in this list with the specified element (optional operation).
(Das ist war als optionale Operation gekennzeichnet, aber die Standard Listen sollten dies alle haben)

Somit kannst Du über eine Liste gehen und dann alle Werte in der anderen Liste setzen.
 
Falls du mehrere Werte hast welche immer den gleichen Index haben sollen, also Haeuser und Zimmer, dann waere es eventuell auch interessant diese direkt als Klasse anzulegen. Also wenn du jetzt zum Beispiel so etwas baust:

Java:
     Haus   Raum
---|------|-----
0:    1      1
1:    1      2
2:    1      3
3:    1      4
4:    1      5
5:    2      1
6:    2      2
7:    3      1
8:    3      2
9:    3      3

Dann waere es besser diese direkt zu einer Klasse zusammenzufassen:

Java:
public class Haus {
    protected int nummer = 0;
    protected List<Raum> raeume = null;
    
    public Haus(int nummer, List<Raum> raeume) {
        super();
        
        this.nummer = nummer;
        this.raeume = raeume;
    }

    // Getter
}


haeuser.add(new Haus(1, Arrays.asList(
        new Raum(1, "Wohnzimmer"),
        new Raum(2, "Kueche"),
        new Raum(3, "Bad"));
haeuser.add(new Haus(2, Arrays.asList(
        new Raum(1, "Wohnzimmer"),
        new Raum(2, "Wohnzimmer"),
        new Raum(3, "Wohnzimmer"),
        new Raum(4, "Kueche"),
        new Raum(5, "Bad"));

Haus zweitesHaus = haeuser.get(1);
Raum dritterRaumZweitesHaus = zweitesHaus.getRaum(2);

So von dem Prinzip her. Zwei getrennte Listen zu halten welche aber miteinander gekoppelte Werte halten ist immer etwas schwierig. So gut wie immer ist es zielfuehrende sich eine Klasse anzulegen welche diese Werte zusammenschweiszt und man damit eine um vielfaches vereinfachte Verwaltung der Liste hat.
 
Vielen Dank ihr beiden. Nein, ursprünglich waren es nicht Haus und Zimmer, sondern Schlachtschiff und tempList, beide vom Datentyp String.
Ich baue gerade ein Schiffe versenken und will beim Setzen der Schiffe Falscheingaben (geklickte Buttons, die nicht in einer Reihe 5 ergeben) löschen. Jetzt probier ich hier ewig rum, wie ich die, die gelöscht werden sollen, von denen die bleiben sollen (5-er-Kette) abgrenze, bin aber noch nicht so weit gekommen. Der Index der tempList soll der der Schlachtschiff-Liste werden, weil es der Index der Buttons ist, auf die ich mich gerade beziehe. Den Einfall zwei Listen zu machen, eine temporäre und eine bleibende, hab ich ehrlicherweise von Chatgpt (ich weiß, soll man nicht machen, aber ich kam nicht voran.)
 
Ich glaube das billigste und einfachse wird sein dass Spielfeld als Array abzubilden mit einem Enum.

Code:
public enum FeldZustand {
    LEER,
    WASSER,
    TREFFER,
    TREFFER_VERSENKT;
}

private FeldZustand[][] spielfeldZustand = new FeldZustand[10][10];

Dann kannst du die Knoepfe der Oberflaeche aus diesme Zustand aufbauen. Gleichzeitig kann jeder Knopf seine Koordinate kennen und damit direkt den Zustand abfragen beziehungsweise setzen. So in etwa:

Code:
private void handleFeldButtonClick(Button feldButton) {
    int feldX = feldButton.getFeldX();
    int feldY = feldButton.getFeldY()
    
    if (spielfeldZustand[feldX][feldY] != FeldZustand.LEER) {
        // Fehlerzustand, bereits probiert.
        return;
    }
    
    Schiff schiff = spieler.getSchiffAuf(feldX, feldY);
    
    if (schiff != null) {
        schiff.setTrefferAuf(feldX, feldY);
        
        if (schiff.isVersenkt()) {
            spielfeldZustand[feldX][feldY] = FeldZustand.TREFFER_VERSENKT;
        } else {
            spielfeldZustand[feldX][feldY] = FeldZustand.TREFFER;
        }
    } else {
        spielfeldZustand[feldX][feldY] = FeldZustand.LEER;
    }
}

So von dem Prinzip her.
 
Danke für deine Hilfestellung. Mit enums habe ich leider noch nie gearbeitet, sieht aber sehr kurz und griffig aus, was du da geschrieben hast. Ich probier noch ein bisschen an meiner Lösung herum, wenn das nicht funktioniert, fuchs ich mich in enums rein. Danke!
 
Evtl. hilft Dir auch schon, wenn Du Komplexität heraus nimmst. Du hast ein Spielfeld aus n x m Feldern. Da dies ja eine feste Größe ist, sind hier für die interne Abbildung tatsächlich Arrays deutlich einfacher.

Da ist also der Gedanke "Keep it simple, stupid"(KISS) wichtig.
 

Zurück
Oben