【问题标题】:How to implement "Cancel" button for a recursive algorithm?如何为递归算法实现“取消”按钮?
【发布时间】:2016-04-15 18:09:53
【问题描述】:

我正在尝试为文件夹同步应用程序中的算法实现“取消”按钮。该算法递归地遍历用户指定的目录结构,将其文件和目录放入 TreeView 中,并根据它们相对于其他文件夹中的等效项是新的、已删除的、已更改的还是未更改的来标记它们。简化代码供参考:

fillInTreeView(File x, TreeItem root) {
    if (x.isFile()) {
        newBranch = makeBranch(x.getName(x.getNameCount() - 1).toString(), root);
        assignMark(newBranch);
    } else {
        newBranch = makeBranch(x.getName(x.getNameCount() - 1).toString(), root);
        assignMark(newBranch);
        fillInTreeView(x, newBranch);
    }
}

我对“取消”的含义感到不安。如果我让它从顶部删除树中的所有内容,该函数是否会继续添加新内容,从取消算法尚未到达的文件中调用自身,使整个按钮毫无意义?我想我宁愿先问,也不愿花几天时间尝试实施它,但后来不得不问,然后重新发现美国。

【问题讨论】:

  • 算法没有用户界面,因此您无法添加“取消”按钮。但是,您可以在其中放置确认对话框。但是如果路径很深,你真的希望每个关卡都点击确定还是取消?
  • 您能否明确说明您希望取消功能做什么?我想它会停止当前执行的递归,通过执行类似@dr_debug 的建议,但你谈论删除文件 - 你的意思是你希望它不仅终止进程,而且撤消它的更改制作?

标签: java recursion cancellation


【解决方案1】:

像这样尝试:

private static boolean cancelled = false;

fillInTreeView(File x, TreeItem root) {
   if(cancelled) return;
   if (x.isFile()) {
        newBranch = makeBranch(x.getName(x.getNameCount() - 1).toString(), root);
        assignMark(newBranch);
    } else {
        newBranch = makeBranch(x.getName(x.getNameCount() - 1).toString(), root);
        assignMark(newBranch);
        fillInTreeView(x, newBranch);
    }
}

/*Your CLick-Listener*/
public void onClick(){
       cancelled = true;
}

【讨论】:

  • 请多解释一下你写的东西,以便人们更快地理解它:)
  • 我认为那行应该是if (cancelled) return,不是吗?
  • 不应该是if(cancelled) return;吗?除非您使cancelled volatile,否则它无论如何都不会起作用。我也不认为它应该是静态的。如果您同时运行 2 个任务会发生什么。
  • 如果 if(!cancelled) return; 你的递归甚至不会运行。
  • 你说得对,我把它改成了if(cancelled) return;谢谢!
【解决方案2】:

您应该有一个简单地导致函数返回该条件的返回条件。通过在递归调用后检查此返回,您甚至可以快速折叠数千个递归。

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2019-01-24
    • 2011-11-19
    • 2019-09-21
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多