我正在尝试创建一个返回字符串链表的方法。有一棵树,树中的每个节点都存储一个字符。该方法应该找到通过树的所有可能路径。每个路径都会创建一个字符串,该字符串将添加到列表中。
在第二个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;
}
答案 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));
}
答案 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。