「戻る」ボタンを実装したいので、関数を入力する前に、一時リストのメインリストからデータをコピーします。ユーザーが「戻る」ボタンをクリックすると、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);
....