1 25 39 package org.jgrapht.alg; 40 41 import java.util.*; 42 43 import org.jgrapht.*; 44 import org.jgrapht.alg.NeighborIndex.*; 45 import org.jgrapht.event.*; 46 47 48 62 public class DirectedNeighborIndex<V, E> 63 implements GraphListener<V, E> 64 { 65 66 68 Map<V, Neighbors<V, E>> predecessorMap = new HashMap<V, Neighbors<V, E>>(); 69 Map<V, Neighbors<V, E>> successorMap = new HashMap<V, Neighbors<V, E>>(); 70 private DirectedGraph<V, E> graph; 71 72 74 79 public DirectedNeighborIndex(DirectedGraph<V, E> g) 80 { 81 graph = g; 82 } 83 84 86 96 public Set<V> predecessorsOf(V v) 97 { 98 return getPredecessors(v).getNeighbors(); 99 } 100 101 113 public List<V> predecessorListOf(V v) 114 { 115 return getPredecessors(v).getNeighborList(); 116 } 117 118 128 public Set<V> successorsOf(V v) 129 { 130 return getSuccessors(v).getNeighbors(); 131 } 132 133 145 public List<V> successorListOf(V v) 146 { 147 return getSuccessors(v).getNeighborList(); 148 } 149 150 153 public void edgeAdded(GraphEdgeChangeEvent<V, E> e) 154 { 155 E edge = e.getEdge(); 156 V source = graph.getEdgeSource(edge); 157 V target = graph.getEdgeTarget(edge); 158 getSuccessors(source).addNeighbor(target); 159 getPredecessors(target).addNeighbor(source); 160 } 161 162 165 public void edgeRemoved(GraphEdgeChangeEvent<V, E> e) 166 { 167 E edge = e.getEdge(); 168 V source = graph.getEdgeSource(edge); 169 V target = graph.getEdgeTarget(edge); 170 if (successorMap.containsKey(source)) { 171 successorMap.get(source).removeNeighbor(target); 172 } 173 if (predecessorMap.containsKey(target)) { 174 predecessorMap.get(target).removeNeighbor(source); 175 } 176 } 177 178 181 public void vertexAdded(GraphVertexChangeEvent<V> e) 182 { 183 } 185 186 189 public void vertexRemoved(GraphVertexChangeEvent<V> e) 190 { 191 predecessorMap.remove(e.getVertex()); 192 successorMap.remove(e.getVertex()); 193 } 194 195 private Neighbors<V, E> getPredecessors(V v) 196 { 197 Neighbors<V, E> neighbors = predecessorMap.get(v); 198 if (neighbors == null) { 199 neighbors = 200 new Neighbors<V, E>(v, 201 Graphs.predecessorListOf(graph, v)); 202 predecessorMap.put(v, neighbors); 203 } 204 return neighbors; 205 } 206 207 private Neighbors<V, E> getSuccessors(V v) 208 { 209 Neighbors<V, E> neighbors = successorMap.get(v); 210 if (neighbors == null) { 211 neighbors = 212 new Neighbors<V, E>(v, 213 Graphs.successorListOf(graph, v)); 214 successorMap.put(v, neighbors); 215 } 216 return neighbors; 217 } 218 } 219 | Popular Tags |