2016-03-25 9 views
0

私はDijkstraの最短パスアルゴリズムを実装しているプログラムで作業しています。隣接関係リストへのリスト

..... adj.vertex重量adj.vertex重量vertexnameパターンと

1 2 1 3 1 
2 4 2 
3 2 2 5 4 
4 3 3 5 3 
5 1 4 

私はいくつかのを発見した:それは形式のテキストファイルで隣接リストの入力で始まりますこのようなグラフを移入するサンプルコードは:

private static final Graph.Edge[] GRAPH = { 
    new Graph.Edge("a", "b", 7), 
    new Graph.Edge("a", "c", 9), 
    new Graph.Edge("a", "f", 14), 
    new Graph.Edge("b", "c", 10), 
    new Graph.Edge("b", "d", 15), 
    new Graph.Edge("c", "d", 11), 
    new Graph.Edge("c", "f", 2), 
    new Graph.Edge("d", "e", 6), 
    new Graph.Edge("e", "f", 9),}; 

これは、私が述べたように、私は上記のものと類似の形式のテキストファイルからこのデータを移入する必要があり、除いて、働くだろう。私が苦しんでいるのは、1行につきデータ量に制限がないということです。ノードには、1つまたは無限に他のノードが接続されている可能性があります。私はこの問題を処理できる解決策を考え出しています。これまでのところ、私は私のメインメソッド内でこのラフな試みを持っている:

Scanner scanner = new Scanner(new File(filename)); 
    while(scanner.hasNextInt()){ 
     String source = scanner.next(); 
     String to = scanner.next(); 
     int weight = scanner.nextInt(); 
     Graph.Edge edge = new Graph.Edge(source, to, weight); 
     if(scanner.hasNext()){ 
      to = scanner.next(); 
      weight = scanner.nextInt(); 
      Graph.Edge edge2 = new Graph.Edge(source, to, weight); 
     } 
    } 

私がしようとすると、このプログラムを実行すると、私はScanner.throwfor、Scanner.nextでこのライン上の私のメインクラス内ではNoSuchElementExceptionを得る:

String to = scanner.next(); 

私の試行は現在のところ完全に構文的に正しいとは言えませんが、私は解決策を見つけるために正しい道を進んでいますか?また、私が探しているキーがありますか、これが簡単になるでしょうか?ありがとう!

EDIT:ここではここで私はhttp://rosettacode.org/wiki/Dijkstra%27s_algorithm#Java

+0

私の現在の思考プロセスは、ファイルの最初の三つの整数を取ることですそれらを新しい端に置く。そこから、ifを使って行内にまだデータがあるかどうかを調べます。存在する場合は、そのデータを新しいエッジに追加します。現在のところ、これは行内の5つの整数に対してのみ動作するように見えます。 – user3068177

答えて

1

で起動コードへのリンク[EDITED]

は、エッジのインスタンスとArrayListに記入されるコードスニペットです:

List<Graph.Edge> list = new ArrayList<Graph.Edge>(); 

try { 
    Scanner scanner = new Scanner(new File(filepath)); 
    while(scanner.hasNextLine()){ 
     String source = scanner.findInLine(NAME); 
     if (source != null) { 
      while(true) { 
       String to = scanner.findInLine(NAME); 
       if (to == null) { 
        break; 
       } 
       int weight = Integer.valueOf(scanner.findInLine(WEIGHT)); 
       list.add(new Graph.Edge(source, to, weight)); 
      } 
     } 
     scanner.nextLine(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

同じsource値のエッジが正しく作成されるように、一度に1行ずつ処理するには、hasNextLinefindInLineを使用します。

NAMEWEIGHTパターンは、これらの定数によって定義されています。少なくとも三つの整数があることが保証されているので、私のコーディングの試みと

static final Pattern NAME = Pattern.compile("\\w+"); 
static final Pattern WEIGHT = Pattern.compile("\\d+"); 
+0

このコードを入力すると、ほとんど同じエラーが表示されます。コンパイラは、コード行が好きではありません。String source = scanner.next();今回は周りに。 – user3068177

+0

ファイル内に空白行だけの空白行がある可能性があります。 'next()'メソッドはトークンがなくなってもあまり許されません。私はそれを世話するためにスニペットを更新しました。 – cybersam

+0

それはそれをやっているようでした、ありがとう!助けを感謝する – user3068177