Reputation: 71
I'm trying to implement Dijkstra algorithm in java from the site of Lars Vogel :
http://www.vogella.com/articles/JavaAlgorithmsDijkstra/article.html.
But there is no main function and when I create one public static void it gives me errors that non-static variables or classes cannot be referenced from static context.
Do I have to make all the classes static or there is another solution?
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();
}
}
Upvotes: 0
Views: 1471
Reputation: 3904
Run it directly with this code:
public static void main() {
new TestDijkstraAlgorithm().testExcute();
}
You have to create an instance of your class first. main
method is always static, so you can't call instance methods (non-static) directly. To create an instance, just call the constructor with new TestDijkstraAlgorithm()
. There is no constructor defined explicitly, so the default one, without parameters, is automatically available.
These are OOP basics, you should really read into it.
That being said, the supposed way to call the testExecute
method is with JUnit.
That's why there is the @Test
annotation.
Upvotes: 2