Problem mit Listen

Status
Nicht offen für weitere Antworten.

tinker

Mitglied
Hallo!

Folgendes Problem:
Hab ne Klasse mit zwei Listen (values und values2) die in der Methode init initialisiert werden. Problem: Wenn ich mir Daten aus der DB holen und sie in die Liste values schreibe, befinden sich nach dem Ende des Schleifendurchlaufs die selben Daten auch in der Liste values2...

Code:
public class AddChangeTableModel extends javax.swing.table.AbstractTableModel {

    private int id;
    private Area area;
    private List<String> cols;
    private List<Data> values;
    private List<Data> values2;

    /** Creates a new instance of AddChangeTableModel */
    public AddChangeTableModel(List<String> cols, List<Data> values, Area area, int id) {
        this.area = area;
        this.cols = cols;
        this.values = values;        
        this.values2 = values;
        this.id = id;

        init();
    }

    private void init() {
        Map<String, String> row = null;
        if (id != 0) {
            row = DataAccess.getRow(area, id);

            // values und values2 beide leer
            
            for (Data data : values) {
                data.setData(row.get(data.getDbField()));
            }
            
            // values und values2 beide mit den selben Werten befüllt... WTF?

            [...]
        }
    }

    [...]
}
Ich checks grad überhaupt nicht, also bitte um Hilfe!
 
this.values = values;
this.values2 = values;


Eine Liste, zwei Referenzen drauf, bzw. 2 Namen dafür 😉
 
Die Variablen referenzieren ja auch auf die selbe Liste:
this.values = values;
this.values2 = values;
 
Du übergibst im Konstruktor eine Referenz auf eine Liste und weist diese Referenz dann zwei verschiedenen Variablen. Damit hast Du aber nur zweimal die Referenz auf die gleiche Liste.
 
Ok, anscheinden haperts da etwas an den basics bei mir...

Aber:
Wenn ichs jetzt auf

this.values = new ArrayList<Data>(values);
this.values2 = new ArrayList<Data>(values);

ändere, womit es dann ja keine Referenzen mehr sein sollten, besteht das Ursprungsproblem noch immer.
 
Du erzeugst jetzt 2 ArrayList mit denselben Daten, was ist deine Frage?
 
@maki:
Jop, und das will ich ja auch, nur scheint es noch immer nicht zu funktionieren. Der Gedanke dahinter:

Data ist ein Java Objekt das einige Attribute beinhaltet. Bei den meisten Attributen handelt es sich um Metadaten, zusätzlich gibt es noch das Attribut data in dem der Wert steht, der am Ende in der Table ausgegeben wird.

So, das Tablemodell bekommt jetzt eine List<Data>, wobei bei den Data-Objekten nur die Attribute der Metadaten befüllt sind, im Attribut data steht kein Wert.

In der Init-Methode werden jetzt Werte aus der DB gelesen und diese data-Attribute werden befüllt. In der Datenbank gibt es jedoch zwei Tabellen mit annähernd den selben Spalten (darum auch die selben Metadaten)

Also erstelle ich eine Liste values die mit den Werten aus der Tabelle A befüllt wird, und eine Liste values2 mit den Werten aus der Tabelle B.

Darum zwei Listen mit den selben Daten (eben die Metadaten).

Ich hoffe es ist klar was ich meine.
 
Der ArrayList-Konstruktor, der eine Collection alls Argument bekommt, macht kein deep-copy der Liste; er übernimmt nur exakt die Elemente aus der Collection (und keine Kopien davon).
Du hast jetzt zwar zwei Listen, aber beide enthalten wieder dieselben Objekte wie die ursprüngliche Liste. Egal über welche der beiden Listen Du iterierst, Du landest immer beim selben Inhalt.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben