2013-05-21 111 views
0

我試圖從拉斯沃格爾的網站在Java中實現Dijkstra算法:
http://www.vogella.com/articles/JavaAlgorithmsDijkstra/article.html
但沒有主要功能,當我創建一個公共靜態無效時,它給了我錯誤,非靜態變量或類不能從靜態上下文中引用。
我是否必須將所有類設爲靜態或有其他解決方案?Dijkstra的最短路徑算法拉爾斯·沃格爾

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(); 
    } 
} 
+0

它可能會幫助您發佈您的代碼。你不能指望ppl爲你猜測問題或者寫出完整的解決方案。 -.- – Nikki

+0

從主要方法創建你的類的一個對象,然後調用Dijkstra方法。 – nalply

+3

您需要創建一個實例'DijkstraAlgorithm'。也許要學習一點OOP。 –

回答

2

與此代碼運行它直接:

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

你必須首先創建類的實例。 main方法總是靜態的,所以你不能直接調用實例方法(非靜態)。要創建實例,只需使用new TestDijkstraAlgorithm()調用構造函數即可。沒有明確定義構造函數,因此默認的構造函數不帶參數,可自動使用。

這些是OOP的基礎知識,你應該真正閱讀它。

這就是說,所謂的testExecute方法的方法是JUnit。 這就是爲什麼有@Test註釋。