Java - 链表初始化不正确
Java - LinkedList is initialized incorrectly
我想实现一个 "back" 按钮,为此,在我输入任何功能之前,我将数据从主列表复制到我的临时列表中。当用户单击 "back" 按钮时,我调用 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);
}
您只是在添加对同一列表的引用。
如果您真的想复制列表,请按以下方式进行:
fnlDataTMP = new ArrayList<List<String>>(fnlData);
假设 fnlData 列表中的列表被操纵,您必须像这样创建一个真实副本:
fnlDataTMP = new ArrayList<List<String>>();
for (List<String> sublist : fnlData) {
fnlDataTMP.add(new ArrayList<String>(sublist));
}
当您执行 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。
只需将其替换为:
ObservableList<List<String>> fnlData = XCollections.observableArrayList();
然后尝试:
private void cnvrtColumn() {
fnlDataTMP = new ArrayList<List<String>>(fnlData);
....
我想实现一个 "back" 按钮,为此,在我输入任何功能之前,我将数据从主列表复制到我的临时列表中。当用户单击 "back" 按钮时,我调用 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);
}
您只是在添加对同一列表的引用。
如果您真的想复制列表,请按以下方式进行:
fnlDataTMP = new ArrayList<List<String>>(fnlData);
假设 fnlData 列表中的列表被操纵,您必须像这样创建一个真实副本:
fnlDataTMP = new ArrayList<List<String>>();
for (List<String> sublist : fnlData) {
fnlDataTMP.add(new ArrayList<String>(sublist));
}
当您执行 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。
只需将其替换为:
ObservableList<List<String>> fnlData = XCollections.observableArrayList();
然后尝试:
private void cnvrtColumn() {
fnlDataTMP = new ArrayList<List<String>>(fnlData);
....