私はGraphクラスを書いています、
HashMap
ノードの ID (int 値) が関連付けられたノードにマップされている を保持し、アプローチを使用してadjacency list
、ノードから開始するエッジを保持します (それらを の形式に保持しますHashSet
) 。
注意: このグラフは有向で重み付けされていません。
class のオブジェクトに対してイテレータを返すメソッドを実装したいEdge
:
この iterator で次に取得すると、トラバースされているときに作成されるクラス Edge のオブジェクトが取得されます。ノードの隣接ノードがなくなった場合は、次のノードに移動し (順序は重要ではありません)、存在しない場合はより多くの開始ノード (すべてがトラバースされます)、終了します。
以前にエッジを Edge クラス オブジェクトに保持せずに、このイテレータをエッジに実装する方法についてのアイデアはありますか?
class Graph{
HashMap<Integer , GraphNode> nodes;
public Graph(){
nodes = new HashMap<Integer ,GraphNode>();
}
public boolean addEdge(GraphNode n1 , GraphNode n2){
if (!nodes.containsKey(n1) || !nodes.containsKey(n2))
return false;
return n1.addNeighbor(n2);
}
public boolean addNode(int id){
if (nodes.containsKey(id))
return false;
nodes.put(id , new GraphNode(id));
return true;
}
public boolean removeNode(GraphNode n1){
if (!nodes.containsKey(n1.content))
return false;
for (GraphNode m : n1.neighbors)
m.removeNeighbor(n1);
nodes.remove(n1);
return false;
}
public boolean removeEdge(GraphNode n1 , GraphNode n2){
if (!nodes.containsKey(n1) || !nodes.containsKey(n2))
return false;
return n1.removeNeighbor(n2);
}
public Iterator<GraphNode> NodeIterator(){
return nodes.values().iterator();
}
public Iterator<Edge> EdgeIterator(){
Iterator<GraphNode> itr = this.NodeIterator();
while (itr.hasNext){
GraphNode n = itr.next();
//......
}
}
}
class GraphNode{
HashSet<GraphNode> neighbors;
int content;
public GraphNode(int content){
this.content = content;
neighbors = new HashSet<GraphNode>();
}
boolean addNeighbor(GraphNode n){
if (neighbors.contains(n))
return false;
neighbors.add(n);
return true;
}
boolean removeNeighbor(GraphNode n){
if (!neighbors.contains(n))
return false;
neighbors.remove(n);
return true;
}
}
class Edge{
Node start , end;
public Edge(Node start , Node end){
this.start = start;
this.end = end;
}
}