0

Lars Vogel のサイトから Java で Dijkstra アルゴリズムを実装しようとしています:
http://www.vogella.com/articles/JavaAlgorithmsDijkstra/article.html
しかし、メイン関数はなく、1 つの public static 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();
  }
}
4

1 に答える 1

2

次のコードで直接実行します。

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

最初にクラスのインスタンスを作成する必要があります。mainメソッドは常に静的であるため、インスタンス メソッド (非静的) を直接呼び出すことはできません。インスタンスを作成するには、コンストラクターをnew TestDijkstraAlgorithm(). 明示的に定義されたコンストラクターはないため、パラメーターのないデフォルトのコンストラクターが自動的に使用可能になります。

これらはOOPの基本です。実際に読んでおく必要があります。

そうは言っても、メソッドを呼び出す想定されるtestExecute方法はJUnitを使用することです。そのため、@Test注釈があります。

于 2013-05-21T08:28:06.860 に答える