有人可以解释为什么在清除cache.clear();
之后删除nextNode的childern节点,如果我通过调用设置缓存conetent arrayList:
child1.setNext(cache);
如果我使用for循环child1.next.add(cacheNode);
for (TrieNode cacheNode : cache) {
child1.next.add(cacheNode);
}
下面的工作有效,但我只想了解为什么我不能使用child1.setNext(cache);
?
代码:
ArrayList<TrieNode> cache = new ArrayList<TrieNode>();
if (nextNode.getNext() != null
&& !nextNode.getNext().isEmpty()) {
for (TrieNode nextNodeChildern : nextNode.getNext()) {
cache.add(nextNodeChildern);
}
nextNode.setEdge(communsubString);
nextNode.getNext().clear();
TrieNode child1 = new TrieNode(substringSplit1);
//child1.setNext(cache);
for (TrieNode cacheNode : cache) {
child1.next.add(cacheNode);
}
nextNode.next.add(child1);
cache.clear();
TrieNode child2 = new TrieNode(substringSplit2);
child2.setWord(true);
nextNode.next.add(child2);
}
TrieNode类:
class TrieNode {
ArrayList<TrieNode> next = new ArrayList<TrieNode>();
String edge;
boolean isWord;
// To create normal node.
TrieNode(String edge) {
this.edge = edge;
}
// To create the root node.
TrieNode() {
this.edge = "";
}
public ArrayList<TrieNode> getNext() {
return next;
}
public void setNext(ArrayList<TrieNode> next) {
this.next = next;
}
public String getEdge() {
return edge;
}
public void setEdge(String edge) {
this.edge = edge;
}
public boolean isWord() {
return isWord;
}
public void setWord(boolean isWord) {
this.isWord = isWord;
}
}
答案 0 :(得分:0)
当您将cache
传递给setNext
时,您传递了对cache
列表的引用,即您节点中的列表和主代码中的列表指向内存中的相同列表。当您致电clear
时,您将清空该节点正在使用的列表。
您需要通过在节点类之外或之内获取副本来为节点使用列表的副本,因此类似这样的内容将起作用:
public void setNext(ArrayList<TrieNode> next) {
this.next = new ArrayList<>(next);
}
这将在节点内创建一个新的ArrayList
,并将next
中的所有元素复制到其中。