2011-01-06 3 views
1

사소한 그래프 형식의 txt 파일에서 꼭지점과 가장자리를 생성하고 싶습니다. 여기 프로그래머 중 한 명이 dijkstra 알고리즘에 대한 데이터를 저장하는 데 사소한 그래프 형식을 사용한다고 제안했습니다.간단한 그래프 형식의 텍스트 파일에서 개체를 만듭니다. 자바. dijkstra algorithm

현재 문제는 모든 정보 (예 : 가중치, 링크)가 소스 코드에 있다는 것입니다. 나는 그것을 위해 별도의 텍스트 파일을 가지고 프로그램에 그것을 읽고 싶다.

나는 스캐너를 사용하여 텍스트 파일을 스캔하는 코드를 사용하려고 생각했습니다. 하지만 난 같은 파일에서 다른 개체를 만드는 방법을 잘 모르겠습니다. 제발 좀 도와 줄래?

파일은

v0 Harrisburg 
v1 Baltimore 
v2 Washington 
v3 Philadelphia 
v4 Binghamton 
v5 Allentown 
v6 New York 
# 
v0 v1 79.83 
v0 v5 81.15 
v1 v0 79.75 
v1 v2 39.42 
v1 v3 103.00 
v2 v1 38.65 
v3 v1 102.53 
v3 v5 61.44 
v3 v6 96.79 
v4 v5 133.04 
v5 v0 81.77 
v5 v3 62.05 
v5 v4 134.47 
v5 v6 91.63 
v6 v3 97.24 
v6 v5 87.94 

이고 익스트라 알고리즘 코드

로부터 다운로드 : http://en.literateprograms.org/Special:Downloadcode/Dijkstra%27s_algorithm_%28Java%29 */

import java.util.PriorityQueue; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.Collections; 


class Vertex implements Comparable<Vertex> 
{ 
public final String name; 
public Edge[] adjacencies; 
public double minDistance = Double.POSITIVE_INFINITY; 
public Vertex previous; 

public Vertex(String argName) { 
    name = argName; 
} 

public String toString() { 
    return name; 
} 


public int compareTo(Vertex other) 
{ 
    return Double.compare(minDistance, other.minDistance); 
} 

} 


class Edge 
{ 
public final Vertex target; 
public final double weight; 

public Edge(Vertex argTarget, double argWeight) { 

    target = argTarget; 
    weight = argWeight; 
} 
} 


public class Dijkstra 
{ 
public static void computePaths(Vertex source) 
{ 
    source.minDistance = 0.; 
    PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>(); 
    vertexQueue.add(source); 

while (!vertexQueue.isEmpty()) { 
    Vertex u = vertexQueue.poll(); 

     // Visit each edge exiting u 
     for (Edge e : u.adjacencies) 
     { 
      Vertex v = e.target; 
      double weight = e.weight; 
      double distanceThroughU = u.minDistance + weight; 
    if (distanceThroughU < v.minDistance) { 
     vertexQueue.remove(v); 

     v.minDistance = distanceThroughU ; 
     v.previous = u; 
     vertexQueue.add(v); 

    } 

     } 
    } 
} 


public static List<Vertex> getShortestPathTo(Vertex target) 
{ 
    List<Vertex> path = new ArrayList<Vertex>(); 
    for (Vertex vertex = target; vertex != null; vertex = vertex.previous) 
     path.add(vertex); 
     Collections.reverse(path); 
     return path; 
} 

public static void main(String[] args) 
{ 

Vertex v0 = new Vertex("Nottinghill_Gate"); 
Vertex v1 = new Vertex("High_Street_kensignton"); 
Vertex v2 = new Vertex("Glouchester_Road"); 
Vertex v3 = new Vertex("South_Kensignton"); 
Vertex v4 = new Vertex("Sloane_Square"); 
Vertex v5 = new Vertex("Victoria"); 
Vertex v6 = new Vertex("Westminster"); 
v0.adjacencies = new Edge[]{new Edge(v1, 79.83), new Edge(v6, 97.24)}; 
v1.adjacencies = new Edge[]{new Edge(v2, 39.42), new Edge(v0, 79.83)}; 
v2.adjacencies = new Edge[]{new Edge(v3, 38.65), new Edge(v1, 39.42)}; 
v3.adjacencies = new Edge[]{new Edge(v4, 102.53), new Edge(v2, 38.65)}; 
v4.adjacencies = new Edge[]{new Edge(v5, 133.04), new Edge(v3, 102.53)}; 
v5.adjacencies = new Edge[]{new Edge(v6, 81.77), new Edge(v4, 133.04)}; 
v6.adjacencies = new Edge[]{new Edge(v0, 97.24), new Edge(v5, 81.77)}; 
Vertex[] vertices = { v0, v1, v2, v3, v4, v5, v6 }; 


    computePaths(v0); 
    for (Vertex v : vertices) 
{ 
    System.out.println("Distance to " + v + ": " + v.minDistance); 
    List<Vertex> path = getShortestPathTo(v); 
    System.out.println("Path: " + path); 
} 

} 
} 

스캔 파일 코드

import java.util.Scanner; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class DataScanner1 { 

//private int total = 0; 
//private int distance = 0; 
private String vector; 
private String stations; 
private double [] Edge = new double []; 

/*public int getTotal(){ 
    return total; 
    } 
    */ 

    /* 
    public void getMenuInput(){ 
    KeyboardInput in = new KeyboardInput; 
    System.out.println("Enter the destination? "); 
    String val = in.readString(); 
    return val; 
    } 
    */ 


public void readFile(String fileName) { 
    try { 
    Scanner scanner = 
     new Scanner(new File(fileName)); 
    scanner.useDelimiter 
     (System.getProperty("line.separator")); 
    while (scanner.hasNext()) { 
     parseLine(scanner.next()); 
    } 
     scanner.close(); 
    } catch (FileNotFoundException e) { 
    e.printStackTrace(); 
    } 
} 



    public void parseLine(String line) { 
    Scanner lineScanner = new Scanner(line); 
    lineScanner.useDelimiter("\\s*,\\s*"); 
    vector = lineScanner.next(); 
    stations = lineScanner.next(); 
    System.out.println("The current station is " + vector + " and the destination to the next station is " + stations + "."); 
    //total += distance; 
    //System.out.println("The total distance is " + total); 
    } 

public static void main(String[] args) { 
    /* if (args.length != 1) { 
    System.err.println("usage: java TextScanner2" 
     + "file location"); 
    System.exit(0); 
    } 
    */ 
    DataScanner1 scanner = new DataScanner1(); 
    scanner.readFile(args[0]); 
    //int total =+ distance; 
    //System.out.println(""); 
    //System.out.println("The total distance is " + scanner.getTotal()); 
} 
} 

답변

0

당신은 꽤 가까이에 있습니다.

각 줄을 읽으려면 String.split(" ")을 사용하십시오. 그러면 파일 한 줄에 각 인수에 대한 문자열 배열이 제공됩니다.

파일을 구문 분석하기 위해 HashMap이 여기에 친구입니다. 소스 파일은 "v0"과 같은 이름으로 작동하므로 키에 "v0"(또는 사용자가보고있는 키) 및 값으로 도시 이름으로 초기화 된 새 Vertex 객체를 저장하는 HashMap<String, Vertex>을 시작하십시오.

두 번째 데이터 덩어리 (인접성)의 루프에서 new Edge(verticies.get(parsedLine[1]), parsedLine[2]))과 같은 말을하여 Edge를 만들고 싶다면 verticies.get(parsedLine[0]).getAdjacencies().add(..)을 통해 적절한 버텍스에 추가 한 다음 ". . "나의 예에서는.

해당 코드는 Vertex.adjacencies를 Edge []로 정의하므로이 예제에서는 필드에서 초기화 된 ArrayList로 만들어야합니다.

+0

감사합니다. 나는 첫 번째 HashMap을했다. 나는 두 번째 것을 지금하려고 노력할 것이다. – user560084

+0

문제 없으니 기꺼이 도와 드리겠습니다. 준비가되면 질문을 "답변 됨"으로 표시하십시오! 그 점은 사이트에서 다른 일을 할 수있게 도와줍니다 :-) 첫 번째 것은 –

+0

, public void parseLine (String line) { 스캐너 lineScanner = 새 스캐너 (라인); lineScanner.useDelimiter ("\\ s *, \\ s *"); v = lineScanner.next(); station = lineScanner.next(); 지도 map = 새 HashMap (); map.put (v, new String [] {역}); String [] myArray = (String []) map.get (v); System.out.println (v + ""+ myArray [0]); }이게 맞습니까? – user560084

관련 문제