2013-05-21 6 views
0

J'essaye d'implémenter l'algorithme de Dijkstra en Java à partir du site de Lars Vogel:
http://www.vogella.com/articles/JavaAlgorithmsDijkstra/article.html.
Mais il n'y a pas de fonction principale et quand je crée un vide public statique, il me donne des erreurs que les variables non-statiques ou les classes ne peuvent pas être référencées à partir du contexte statique.
Dois-je rendre toutes les classes statiques ou y a-t-il une autre solution?Algorithme de plus court chemin de Dijkstra Lars Vogel

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

cela pourrait être utile si vous postez votre code. Vous ne pouvez pas vous attendre à ce que ppl devine le problème ou rédige des solutions entières pour vous. -.- – Nikki

+0

De la méthode principale, créez un objet de votre classe, puis appelez la méthode Dijkstra. – nalply

+3

Vous devez créer une instance 'DijkstraAlgorithm'. Et peut-être pour apprendre un peu de POO. –

Répondre

2

Exécuter directement avec ce code:

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

Vous devez créer une instance de votre classe de première. La méthode main est toujours statique, vous ne pouvez donc pas appeler directement les méthodes d'instance (non statiques). Pour créer une instance, appelez simplement le constructeur avec new TestDijkstraAlgorithm(). Il n'y a pas de constructeur défini explicitement, donc celui par défaut, sans paramètres, est automatiquement disponible.

Ce sont OOP de base, vous devriez vraiment lire dedans. Ceci étant dit, la méthode supposée pour appeler la méthode testExecute est avec JUnit. C'est pourquoi il y a l'annotation @Test.

Questions connexes