我寫一個Graph類,迭代器多套
我保持HashMap
在哪些節點(INT值)的ID都會被映射到相關的節點,我使用adjacency list
方法來保持從邊緣開始一個節點(使它們保持在一個HashSet
的形式)
注意的是:該圖是針對和未加權,
我想要實現其超過Edge
類對象返回一個迭代的方法:
當獲得下一個迭代器時,會得到一個類Edge的對象,該對象在被遍歷時被創建,並且如果沒有更多的節點鄰居,它會轉到下一個節點(順序不重要),如果沒有更多的起始節點(全部遍歷),它完成。
有關如何在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;
}
}
你想實現什麼? – 2013-06-27 20:56:18
它現在更新了,我想更新我解釋的迭代器 –
什麼是你想要實現的圖表類型? –