3

我正在尝试创建一个返回字符串链接列表的方法。有一棵树,树中的每个节点都存储一个字符。该方法应该找到通过树的所有可能路径。每个路径创建一个字符串,该字符串被添加到列表中。

在第二个 for 循环中似乎存在我无法弄清楚的问题。该方法仅返回在第一个 if 语句中添加的字符。

每个节点包含变量 childList,它是子节点的链表,和 nodevalue,它是节点存储的字符。

public LinkedList<String> findStrings() {
    LinkedList<String> paths = new LinkedList<String>();
    //add character to list if there are no children
    if (childList.isEmpty()){
        paths.add("" + nodevalue);
        return paths;
    }
    //use recursion to add paths from all children to the list
    for (TreeNode t : childList){
        paths.addAll(t.findStrings());
        //add nodevalue to the beginning of all strings in the list
        for (String s : paths){
            s = nodevalue + s;
        }
    }
    for (String s : paths) System.out.println(s); //for debugging
    return paths;
}
4

5 回答 5

2

当您更改s内部循环时,您只是重新分配变量s,而不是存储在链接列表中的值。相反,您应该遍历列表中的所有元素,一一更新它们。我认为这样的事情应该有效:

//use recursion to add paths from all children to the list
for (TreeNode t : childList){
    paths.addAll(t.findStrings());
    //add nodevalue to the beginning of all strings in the list
    int length = paths.size();
    for (int i=0; i<length; i++) {
        paths.offer(nodevalue + paths.poll());
    }
}

poll从列表的前面取出第一项,offer并将结果放在后面。你把第一个项目拿下来,改变它,然后把它放在后面——重复paths.size()几次,你最终得到的是原始顺序中的更新项目。

于 2012-11-15T06:35:09.703 回答
1

增强的 for 循环在这里没有帮助。

您将不得不使用传统的方法,如下所示:

for (int i=0; i<paths.size(); i++){
    paths.set(i, paths.get(i) + paths.get(i));
}

这里:public E set(int index, E element)

于 2012-11-15T06:35:19.917 回答
1

String 是一个不可变类型的赋值

s = nodevalue + s;

不被认可

更好的解决方案应该是

for (TreeNode t : childList){
    final List<String> pathes = t.findStrings();
    for (final String path : pathes) {
      // add all pathes to paths list adding nodevalue to the beginning
      paths.add(nodevalue + path); 
    }
}
于 2012-11-15T06:30:53.033 回答
0

正如迈克尔所说,您不能在每个循环中替换条目的值。而且由于字符串是不可变的,因此您无法更改现有字符串。

你需要执行一个正常的循环:

for (int i=0;i<paths.size(); i++) {
    paths.set(i, nodevalue +paths.get(i));
}

请注意,您不会更改现有字符串的值,而是将其替换为同一位置的新字符串。

于 2012-11-15T06:37:35.030 回答
0

在本声明中:

for (String s : paths){
            s = nodevalue + s;
}

你实际上并没有改变 s 的值。事实上,你不能像现在这样。for-each 循环不能更改它正在迭代的元素。

于 2012-11-15T06:30:00.107 回答