【问题标题】:Dijkstra's shortest path algorithm Lars VogelDijkstra 的最短路径算法 Lars Vogel
【发布时间】:2013-05-21 08:20:31
【问题描述】:

我正在尝试从 Lars Vogel 的网站用 Java 实现 Dijkstra 算法:
http://www.vogella.com/articles/JavaAlgorithmsDijkstra/article.html.
但是没有 main 函数,当我创建一个公共静态 void 时,它会给我错误,即无法从静态上下文中引用非静态变量或类。
我必须将所有类设为静态还是有其他解决方案?

    package de.vogella.algorithms.dijkstra.test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.junit.Test;

import de.vogella.algorithms.dijkstra.engine.DijkstraAlgorithm;
import de.vogella.algorithms.dijkstra.model.Edge;
import de.vogella.algorithms.dijkstra.model.Graph;
import de.vogella.algorithms.dijkstra.model.Vertex;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;


public class TestDijkstraAlgorithm {
    private List<Vertex> nodes;
  private List<Edge> edges;

  @Test
  public void testExcute() {
    nodes = new ArrayList<>();
    edges = new ArrayList<>();
    for (int i = 0; i < 11; i++) {
      Vertex location = new Vertex("Node_" + i, "Node_" + i);
      nodes.add(location);
    }

    addLane("Edge_0", 0, 1, 85);
    addLane("Edge_1", 0, 2, 217);
    addLane("Edge_2", 0, 4, 173);
    addLane("Edge_3", 2, 6, 186);
    addLane("Edge_4", 2, 7, 103);
    addLane("Edge_5", 3, 7, 183);
    addLane("Edge_6", 5, 8, 250);
    addLane("Edge_7", 8, 9, 84);
    addLane("Edge_8", 7, 9, 167);
    addLane("Edge_9", 4, 9, 502);
    addLane("Edge_10", 9, 10, 40);
    addLane("Edge_11", 1, 10, 600);

    // Lets check from location Loc_1 to Loc_10
    Graph graph = new Graph(nodes, edges);
    DijkstraAlgorithm dijkstra = new DijkstraAlgorithm(graph);
    dijkstra.execute(nodes.get(0));
    LinkedList<Vertex> path = dijkstra.getPath(nodes.get(10));

    assertNotNull(path);
    assertTrue(path.size() > 0);

    for (Vertex vertex : path) {
      System.out.println(vertex);
    }

  }

  private void addLane(String laneId, int sourceLocNo, int destLocNo,
      int duration) {
    Edge lane = new Edge(laneId,nodes.get(sourceLocNo), nodes.get(destLocNo), duration);
    edges.add(lane);
  }

  public  static void main() {
      testExcute();
  }
}

【问题讨论】:

  • 如果您发布代码可能会有所帮助。您不能指望 ppl 猜测问题或为您编写完整的解决方案。 -.-
  • 从 main 方法创建您的类的对象,然后调用 Dijkstra 方法。
  • 您需要创建一个实例DijkstraAlgorithm。或许还可以学习一点 OOP。
  • 你试过什么?显示您的代码。除此之外,只需将 testExcute() 中的内容放在您的 main 函数中...
  • 其实我什至不知道有一个算法的主要方法是否有用。它不会做任何你可以实际看到的事情,它只是你自己的编程逻辑的基础。作者添加了一些 JUnit 测试,所以运行它们来验证代码

标签: java


【解决方案1】:

直接用这段代码运行它:

public static void main() {
    new TestDijkstraAlgorithm().testExcute();
}

你必须首先创建你的类的一个实例。 mainmethod 始终是静态的,因此不能直接调用实例方法(非静态)。要创建实例,只需使用new TestDijkstraAlgorithm() 调用构造函数。没有显式定义的构造函数,所以默认的没有参数的,自动可用。

这些是OOP 的基础知识,您应该认真阅读。

话虽如此,调用testExecute方法的假定方法是使用JUnit。 这就是为什么有 @Test 注释的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多