循环遍历列表,将字符添加到Java中的字符串列表中

时间:2012-11-15 06:25:01

标签: java foreach linked-list

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

在第二个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;
}

5 个答案:

答案 0 :(得分: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()次,最后按原始顺序更新项目。

答案 1 :(得分: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); 
    }
}

答案 2 :(得分: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)

答案 3 :(得分:0)

在此声明中:

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

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

答案 4 :(得分:0)

正如迈克尔所说,你无法替换每个循环中的条目值。因为字符串是不可变的,所以你不能改变现有的字符串。

您需要执行正常循环:

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

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