2012-04-08 10 views
1

方法は、次のような次のとおりです。ビルドグラフ与えられた座標

 
nodeName 
nodeName's x-coord, nodeName's y-coord 
x-coord of an adjacent node, y-coord of that adjacent node 

...と、残りの隣接ノードのちょうどより多く座標です。私はどのようにグラフとして格納する方法を把握しようとしているので、パスが合法であるかどうかを確認することができます。たとえば、nodeA-nodeB-nodeCは有効ですが、nodeA-nodeC-nodeDは有効ではありません。

私の最終的な質問は、Graphクラスをコーディングし、このデータを読み込むことでデータを取り込む最良の方法は何ですか?

+0

パスが「合法」であるとはどういう意味ですか? –

+0

@AlexeyBerezkinデータに指定された隣接関係によってノードからノードに移動することによって到達できない不正なパスがあります。 – varatis

+0

@AlexeyBerezkinたとえば、上記のデータでは、ノードAからノード(2,1)がありますが、コードでノードに行くことはできません(3,3) – varatis

答えて

1

ファイルを行のグループに分割することができます。各グループはノードを記述する。そして、すべてのグループを解析します。

あなたはちょうど SimpleGraphのインスタンスを作成し、ノードとエッジを移入でき JGraphT

を使用して検討する必要があります

Map<Node, List<Node>> neighbors; 
Map<String, Node> nodeByCoords; 

// Get node by it's coordinates. Create new node, if it doesn't exist. 
Node getNode(String coords) { 
    String[] crds = coords.split(" "); 
    int x = Integer.parseInt(crds[0]); 
    int y = Integer.parseInt(crds[1]); 
    String key = x + " " + y; 
    if (!nodeByCoords.containsKey(key)) { 
     Node node = new Node(); 
     node.setX(x); 
     node.setY(y); 
     nodeByCoords.put(key, node); 
     neighbords.put(node, new ArrayList<Node>()); 
    } 
    return nodeByCoords.get(key); 
} 

// Create node (if not exists) and add neighbors. 
void List<String> readNode(List<String> description) { 
    Node node = getNode(description.get(1)); 
    node.setName(description.get(0)); 

    for (int i = 2; i < description.size(); i++) { 
     Node neighbor = getNode(description.get(i)); 
     neighbors.get(node).add(neighbor); 
    } 
} 

// Splits lines to groups. Each group describes particular node. 
List<List<String>> splitLinesByGroups (String filename) { 
    BufferedReader reader = new BufferedReader(new FileReader(filename)); 
    List<List<String>> groups = new ArrayList<List<String>>(); 
    List<String> group = new ArrayList<String>(); 
    while (reader.ready()) { 
     String line = reader.readLine(); 
     if (Character.isLetter(line.charAt())) { 
      groups.add(group); 
      group = new ArrayList<String>(); 
     } 
     group.add(line); 
    } 
    groups.add(group); 
    return groups; 
} 

// Read file, split it to groups and read nodes from groups. 
void readGraph(String filename) { 
    List<List<String>> groups = splitLineByGroups(filename); 
    for (List<String> group: groups) { 
     readNode(group); 
    } 
} 
+0

はい。ありがとう、これはまさに私が探していたものです – varatis

+0

各ノードが隣人を保管するNodeクラスを作ることにしましたが、Nikitaは同じように動作しました。 – varatis

0

パスが正しいかどうかを調べるために、何らかの方法でノードを保存する必要はないと思います。次のノードの読み方をチェックすることができます。次のノードは、座標が以前のものと1だけ異なる場合にのみ有効です。

+0

ええ、私はファイルを繰り返し読んで、各ノードの座標と隣接関係がこれを解決するためには必ず効率的な方法であると考えているとは思わない。テストしたいパスがたくさんある場合はどうなりますか? nodeA-nodeC-nodeD、nodeE-nodeF-nodeGなどと同様です。 – varatis

+0

あなたはどのような順序のファッション(ArrayList、LinkedListなど)でもノードを保存できると思います。次に、リストノードを反復処理して、次のノード座標が合法であるかどうかをチェックします。 –

0

// Define your node, override 'equals' and 'hashCode' 
public class Node { 

    public int x, y; 

    Node (int _x, int _y) { 
    x = _x; 
    y = _y; 
    } 

    @Override public boolean equals (Object other) { 
    if ((other.x == x) 
     && (other.y == y)) 
     return true; 

    return false; 
    } 

    /* Override hashCode also */ 
} 

// Later on, you just add edges and vertices to your graph 
SimpleGraph<Node,Edge> sg; 
sg.addEdge (...); 
sg.addVertex (...); 

最後に、あなたは見つけることDijkstraShortestPathを使用することができますパスが存在するかどうか:

関連する問題