前提・実現したいこと
頂点と辺を持つグラフにおいて、ある頂点に接続する辺を、
HashMap<Node, List<Edge>>
の形で表現したい。
Node:頂点クラス
Edge:辺クラス
Parserを使ったNodeの読み込みのところで、接続する辺のIDを取得できるのですが、
そこからEdge(ID, 端点1, 端点2, 重み)を作成してListに入れ込む方法がわかりません。
そこを教えていただきたいです。よろしくお願いします。ほかの場所でおかしな部分があれば合わせて教えていただきたいです。
Java
1import java.util.*; 2import java.io.*; 3 4public class Graph{ 5 Map<Node, List<Edge>> graph = new HashMap<>(); 6 List<Edge> e = new ArrayList<>(); 7 class Edge{ 8 int id; //辺の識別番号 9 int node1, node2; //辺の両端の頂点 10 int weight; //辺の重み 11 12 Map<Integer, Node> nodes; 13 List<Edge>[] eds; 14 15 Edge(int id, int node1, int node2, int weight){ 16 this.id = id; 17 this.node1 = node1; 18 this.node2 = node2; 19 this.weight = weight; 20 } 21 22 int getNode1(){ 23 return node1; 24 } 25 int getNode2(){ 26 return node2; 27 } 28 int getWeight(){ 29 return weight; 30 } 31 32 // データファイルから生成するコンストラクタ 33 // 頂点(変数)の集合を参照する 34 Edge(Parser p,Map<Integer, Node> nds) throws IOException{ 35 nodes = nds; 36 37 p.getLPar(); 38 id = p.getNumber(); // 辺の識別名 39 System.out.println(" 辺"+id); 40 41 p.getLPar(); // 変数の識別名のリスト(二項関数) 42 node1 = p.getNumber(); 43 System.out.println(" 頂点1="+node1); 44 node2 = p.getNumber(); 45 System.out.println(" 頂点2="+node2); 46 p.getRPar(); 47 weight = p.getNumber(); //辺の重み 48 p.getRPar(); 49 } 50 } 51 52 class Node{ 53 int id; 54 ArrayList<Integer> edges; 55 int x, y; 56 int w; //0:non-taskendpoint, 1:endpoint, 2:taskendpoint 57 List<Edge> eds; 58 59 Node(int id){ 60 this.id = id; 61 this.edges = new ArrayList<Integer>(); 62 } 63 64 ArrayList<Integer> getList(){ //隣接する辺の取得 65 return new ArrayList<>(edges); 66 } 67 68 Node(Parser p) throws IOException{ // データファイルから生成するコンストラクタ 69 p.getLPar(); 70 id = p.getNumber(); // 頂点の識別名 71 System.out.println(" 頂点"+id); 72 //Node node = new Node(id); 73 this.edges = new ArrayList<Integer>(); 74 75 p.getLPar(); // 関数の識別名のリスト 76 while(p.isNumber()){ 77 int a = p.getNumber(); 78 edges.add(a); 79 eds.add(new Edge(a,getNode1(),getNode2(),getWeight())); 80 } 81 p.getRPar(); 82 System.out.println(" 接続する辺の識別名のリスト="+edges); 83 84 85 p.getLPar(); //座標 86 x = p.getNumber(); 87 y = p.getNumber(); 88 p.getRPar(); 89 90 w = p.getNumber(); //属性 91 92 p.getRPar(); 93 } 94 } 95 96}
マークダウンは正しく使ってください。
コードの前に書いてある"Java"を"```java"と書き直し、
その上の文章を囲っている"```"を消してください。
失礼しました。修正方法まで丁寧にありがとうございます。
そのMapの場合、構造上同じ Edge が2つの Node について存在することになりますが、その認識で間違いないでしょうか?
そもそもParserというものが出てくるということはファイルなどから何かグラフに関するものを読み込んでいるのでしょうか?
問題の背景がさっぱりわからないので回答しにくいです。
なお、書き方がわからないって投げ出すのは丸投げに近いです。
eds.add(new Edge(a,getNode1(),getNode2(),getWeight()));
などの行は不明な変数など明らかに動かないものが並んでいます。
まずは努力して動く状態を作ってみてはどうでしょうか?