2016-03-25 1 views
0

Ich arbeite an einem Programm, das Dijkstra's kürzesten Pfad Algorithmus implementiert. Es beginnt mit dem Eingang eines Adjazenzliste in einer Textdatei im Format:Adjazenzliste zu gerichtetes Diagramm

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

mit dem Muster vertexname adj.vertex Gewicht adj.vertex Gewicht .....

Ich habe einige gefunden Beispielcode, der die Grafik wie folgt auffüllt:

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),}; 

Dies funktionieren würde, es sei denn, wie gesagt, ich brauche diese Daten aus einer Textdatei ähnlich der oben eine formatiert zu füllen. Das Problem ist, dass die Datenmenge pro Zeile nicht begrenzt ist. Ein Knoten könnte einen oder unendlich viele andere Knoten haben. Ich versuche, eine Lösung zu finden, die mit diesem Problem umgehen kann. Bisher hat ich diesen groben Versuch in meiner Haupt-Methode:

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); 
     } 
    } 

Wenn ich versuche, und dieses Programm ausführen, bekomme ich NoSuchElementException bei Scanner.throwfor, Scanner.next und in meiner Hauptklasse auf dieser Linie:

String to = scanner.next(); 

Ich verstehe, dass mein Versuch derzeit nicht vollständig syntaktisch korrekt ist, aber bin ich auf dem richtigen Weg, eine Lösung zu finden? Gibt es irgendeinen Schlüssel, über den ich nachdenke, oder was würde das einfacher machen? Vielen Dank!

EDIT: Hier ist der Link zu dem Code Ich begann mit http://rosettacode.org/wiki/Dijkstra%27s_algorithm#Java

+0

Mein aktueller Denkprozess mit meinem Codierung Versuch, die ersten drei Zahlen der Datei zu nehmen, denn es garantiert mindestens drei ganze Zahlen sein in einer Linie und setze diese in eine neue Kante. Von dort versuche ich und verwende das if, um zu sehen, ob noch mehr Daten in der Zeile sind. Wenn dies der Fall ist, füge ich diese Daten zu einer neuen Kante hinzu. Momentan scheint dies nur für 5 ganze Zahlen in einer Zeile zu funktionieren. – user3068177

Antwort

1

[EDITED]

Hier ist ein Code-Snippet, das in einem ArrayList mit den Kanten Instanzen füllen:

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

Es verwendet hasNextLine und findInLine, um eine Linie nach der anderen zu verarbeiten, um sicherzustellen, dass die Kanten mit demselben Wert source ordnungsgemäß erstellt werden.

Die NAME und WEIGHT Muster werden durch diese Konstanten definiert:

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

Wenn ich diesen Code eingib, erhalte ich immer noch die gleichen Fehler. Der Compiler mag die Codezeile nicht. String source = scanner.next(); dieses Mal herum. – user3068177

+0

Wahrscheinlich haben Sie leere Zeilen oder Zeilen mit nur Leerzeichen in Ihrer Datei. Die Methode 'next()' ist nicht sehr fehlerverzeihend, wenn keine Token mehr vorhanden sind. Ich habe mein Snippet aktualisiert, um darauf zu achten. – cybersam

+0

Das schien es zu tun, danke! Schätze die Hilfe – user3068177

Verwandte Themen