Java 迪克斯特拉';s最短路径算法Lars-Vogel

Java 迪克斯特拉';s最短路径算法Lars-Vogel,java,Java,我试图在Lars Vogel的网站上用java实现Dijkstra算法: . 但是没有主函数,当我创建一个公共静态void时,它会给我错误,即不能从静态上下文引用非静态变量或类。 我必须使所有的类都是静态的还是有其他的解决方案 package de.vogella.algorithms.dijkstra.test; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; impor

我试图在Lars Vogel的网站上用java实现Dijkstra算法:
.
但是没有主函数,当我创建一个公共静态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();
  }
}
package de.vogella.algorithms.dijkstra.test;
导入java.util.ArrayList;
导入java.util.LinkedList;
导入java.util.List;
导入org.junit.Test;
导入de.vogela.algorithms.dijkstra.engine.dijkstra算法;
导入de.vogela.algorithms.dijkstra.model.Edge;
导入de.vogela.algorithms.dijkstra.model.Graph;
导入de.vogela.algorithms.dijkstra.model.Vertex;
导入静态org.junit.Assert.assertNotNull;
导入静态org.junit.Assert.assertTrue;
公共类TestDijkstra算法{
私有列表节点;
私有列表边缘;
@试验
public void testExcute(){
节点=新的ArrayList();
边=新的ArrayList();
对于(int i=0;i<11;i++){
顶点位置=新顶点(“节点”+i,“节点”+i);
添加(位置);
}
addLane(“边缘0,0,1,85”);
addLane(“边缘1”,0,2,217);
addLane(“边缘2”,0,4,173);
addLane(“边缘3”,2,6,186);
addLane(“边缘4”,2,7,103);
addLane(“边缘5”,3,7,183);
addLane(“Edge_6”,5,8250);
addLane(“边缘7”、8、9、84);
addLane(“Edge_8”、7、9、167);
addLane(“边缘9”,4,9,502);
addLane(“边缘10”、9、10、40);
addLane(“边缘11”,1,10,600);
//让我们从位置Loc_1到Loc_10进行检查
图形=新图形(节点、边);
dijkstra算法dijkstra=新的dijkstra算法(图);
dijkstra.execute(nodes.get(0));
LinkedList path=dijkstra.getPath(nodes.get(10));
assertNotNull(路径);
assertTrue(path.size()>0);
用于(顶点:路径){
System.out.println(顶点);
}
}
私有void addLane(字符串laneId、int-sourceLocNo、int-destLocNo、,
整数(持续时间){
边车道=新边(laneId,nodes.get(sourceLocNo),nodes.get(destLocNo),持续时间);
添加(车道);
}
公共静态void main(){
testExcute();
}
}

直接使用以下代码运行:

public static void main() {
    new TestDijkstraAlgorithm().testExcute();
}
您必须首先创建类的实例
main
方法始终是静态的,所以不能直接调用实例方法(非静态)。要创建实例,只需使用
newtestdijkstraalgorithm()
调用构造函数。没有显式定义构造函数,因此默认构造函数(不带参数)自动可用

这些都是基础知识,你应该认真阅读

也就是说,调用
testExecute
方法的假定方法是使用。
这就是为什么会有
@Test
注释。

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