1

我的问题很简单。

假设我正在执行算法“A 星”(使用启发式函数计算下一个要访问的状态的搜索算法)。

我想在网格中显示更新(我会将其应用于 8 谜题)。我该怎么做?我希望更改清晰可见..但根据我的经验,如果我只是做类似Grid[6].showValue(newValue)GUI 之类的事情,只会“待机”。

我确信这可以通过多线程来完成(也许?)但是有没有更简单的方法?

如果可能,还有一个非常简单的问题:我想知道在 Java(我的 IDE 是 Netbeans)中是否有任何类包含用于搜索的方法,如 BFS、DFS 和 A 星?如果是这样,您能否提供算法代码的链接(我需要将它们用作我的代码的基础......我不能直接包含它们......你知道......大学作业)。我想这段代码很容易找到,因为 Java 是一种开源语言。我错了吗?

非常感谢你

4

2 回答 2

3

不要在 GUI 线程中进行处理。

如果我们在这里谈论,那就是事件调度线程;使用Swing 中的并发教程中描述的工作线程。

于 2012-03-26T18:39:35.847 回答
1

您应该在单独的线程中进行处理,如 MДΓΓ БДLL 建议的那样。基本上,您必须在一个实现的类中实现与搜索相关的代码,该类Runnable“标记”一个类可以在线程中执行。

为此,您可以使用SwingWorker

SwingWorker<Integer[], Void> worker = new SwingWorker<Integer[], Void>() {
    public Integer[] doInBackground() {
        //do the computation here. This will be executed in a different thread; 
        //thus allowing the event dispatch thread (=GUI thread) to ensure responsiveness of the UI.
        //NEVER update your GUI here since this could cause strange errors that are sometimes hard to track down.
    }
    public void done() {
        try {
            Integer[] result = get(); //this is executed in the GUI thread after 
            //execution if the doInBackground method finished and fetches the result of 
            //that method. You should update your GUI here.
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }
   }
}

对于您的第二个答案:以可用于不同数据类型的通用方式实现算法相当困难,特别是因为您使用 BFS、DFS 和 A-Star 的树可能包含任何类型的数据。我认为您应该在教科书或讲座节点中找到伪代码中的算法;如果没有,请在某个地方查找并尝试自己实现它。

于 2012-03-26T20:14:25.397 回答