我想实现一个“后退”按钮,为此,在我输入任何功能之前,我从临时列表中的主列表中复制数据。当用户点击“后退”按钮时,我调用tempList而不是mainList。
但是虽然我使用mainList的旧值初始化了tempList(只有一次),但在函数之后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);
}
答案 0 :(得分:2)
当你做List ListA = listB时,你只是告诉listA和listB指向同一个列表。如果您希望listA成为具有相同值的列表,但如果没有它是实际相同的值,则必须手动复制它们。
由于列表是可变的,你不能只是克隆外部列表,你必须通过它并克隆每个内部列表。
所以:
List<List<String>> newList = new ArrayList<List<String>>();
for(List<String> ls : outerList) {
newList.add(oldArrayList.clone();
}
这将为您提供克隆列表的列表,您可以自由更改newList中的所有列表,而不会影响oldList中的任何内容。由于innerLists包含字符串(并且在创建后无法更改字符串),因此您不必担心只是克隆innerLists。
答案 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 :(得分:1)
只需将其替换为:
ObservableList<List<String>> fnlData = XCollections.observableArrayList();
然后尝试:
private void cnvrtColumn() {
fnlDataTMP = new ArrayList<List<String>>(fnlData);
....