/ / Java-LinkedListが正しく初期化されません-java、list、initialization

Java - LinkedListが正しく初期化されない - java、list、initialization

「戻る」ボタンを実装したいので、関数を入力する前に、一時リストのメインリストからデータをコピーします。ユーザーが「戻る」ボタンをクリックすると、mainListではなくtempListが呼び出されます。

しかし、私はtempListをmainListの古い値で(一度だけ)初期化しましたが、関数の後、tempListはmainListの新しい値を持ちます。

コード:

     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);
}

回答:

回答№1は1

同じリストへの参照を追加しているだけです。

リストを本当にコピーしたい場合は、次のようにします。

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

fnlDataリスト内のリストが操作されていると仮定すると、真のコピーを作成するには次のようにする必要があります。

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

回答№2については2

リストlistA = listBを実行すると、listAとlistBに同じリストを指すように指示します。 listAを同じ値を持つリストにしたいが、実際の値が同じでない場合は、それらを手動でコピーする必要があります。

リストは変更可能であるため、「外側のリストを複製することはできません。それを調べて、内側のリストをそれぞれ複製する必要があります。

そう:

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

これにより、クローンリストのリストが表示されます。oldListに影響を与えることなく、newListのすべてのリストを自由に変更できます。 innerListsには文字列が含まれているため(また、文字列は「作成後に変更することはできません」)、innerListsを複製することだけを心配する必要はありません。


回答№3の場合は1

次のように置き換えてください:

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

そして、試してください:

private void cnvrtColumn() {

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