/ / Java - LinkedList jest niepoprawnie zainicjowany - Java, lista, inicjalizacja

Java - LinkedList jest źle zainicjalizowany - java, lista, inicjalizacja

Chcę wdrożyć przycisk „wstecz” i do tego,zanim wejdę do jakiejkolwiek funkcji, kopiuję dane z głównej listy na mojej liście tymczasowej. Gdy użytkownik kliknie przycisk „wstecz”, wywołuję tempList zamiast mainList.

Ale chociaż zainicjowałem tempList (tylko raz) ze starą wartością mainList, po funkcji tempList ma nowe wartości mainList ....

Kod:

     ObservableList<List<String>> fnlData;

List<List<String>> fnlDataTMP;
.
.

private void cnvrtColumn() {

fnlDataTMP = fnlData;

delWV();//if the mainList(fnlData) has a change in any of this functions, the tmpList also updates the values
delWM();
addVN();
addWV();
addWM();
dateFormat();
changeChar();

finalTable.getSelectionModel().clearSelection();
finalTable.getItems().clear();
finalTable.getColumns().clear();
createColumns();
finalTable.getItems().addAll(fnlData);
}

Odpowiedzi:

1 dla odpowiedzi № 1

Właśnie dodajesz odwołanie do tej samej listy.

Jeśli naprawdę chcesz skopiować listy, zrób to w ten sposób:

fnlDataTMP = new ArrayList<List<String>>(fnlData);

Zakładając, że listy wewnątrz listy fnlData są zmanipulowane, musisz zrobić to w ten sposób, aby utworzyć prawdziwą kopię:

fnlDataTMP = new ArrayList<List<String>>();
for (List<String> sublist : fnlData) {
fnlDataTMP.add(new ArrayList<String>(sublist));
}

2 dla odpowiedzi nr 2

Kiedy robisz List list A = listB jesteś po prostuinformowanie list A i list B o wskazaniu tej samej listy. Jeśli chcesz, aby listA była listą o takich samych wartościach, ale bez rzeczywistych tych samych wartości, musisz je ręcznie skopiować.

Ponieważ Listy są zmienne, nie możesz po prostu sklonować zewnętrznej listy, musisz ją przejrzeć i sklonować każdą z wewnętrznych list.

Więc:

List<List<String>> newList = new ArrayList<List<String>>();
for(List<String> ls : outerList) {
newList.add(oldArrayList.clone();
}

To da ci listę sklonowanych list imożesz dowolnie zmieniać wszystkie listy w newList bez wpływu na cokolwiek w oldList. Ponieważ wewnętrzne listy zawierają ciągi (a ciągów nie można zmienić po utworzeniu), nie musisz się martwić o klonowanie wewnętrznych list.


1 dla odpowiedzi nr 3

Po prostu zamień na:

ObservableList<List<String>> fnlData = XCollections.observableArrayList();

A następnie spróbuj:

private void cnvrtColumn() {

fnlDataTMP = new ArrayList<List<String>>(fnlData);
....