package br.com.etyllica.linear.graph; import java.util.ArrayList; import java.util.List; import br.com.etyllica.core.linear.Point2D; public class GenericGraph<T, E extends GenericEdge<T>> { protected List<Node<T>> nodes; protected List<E> edges; public GenericGraph() { super(); nodes = new ArrayList<Node<T>>(); edges = new ArrayList<E>(); } public List<Node<T>> getNodes() { return nodes; } public void setNodes(List<Node<T>> nodes) { this.nodes = nodes; } public void addNode(Node<T> node) { this.nodes.add(node); } public Node<T> addNode(int index, Point2D point) { Node<T> node = new Node<T>(point.getX(), point.getY()); this.nodes.add(index, node); return node; } public Node<T> addNode(Point2D point) { Node<T> node = new Node<T>(point.getX(), point.getY()); this.nodes.add(node); return node; } public List<E> getEdges() { return edges; } public List<E> getEdges(Node<T> node) { List<E> nodeEdges = new ArrayList<E>(); for(E edge:edges) { if(edge.getOrigin()==node||edge.getDestination()==node) { nodeEdges.add(edge); } } return nodeEdges; } public void removeNode(Node<T> node) { nodes.remove(node); removeEdgesFromNode(node); } public void removeEdgesFromNode(Node<T> node) { for (int i = edges.size()-1;i>=0;i--) { E edge = edges.get(i); if (edge.getOrigin() == node || edge.getDestination() == node) { edges.remove(i); } } } public boolean hasEdge(Node<Integer> node, Node<Integer> otherNode) { for(E edge:edges) { if ((edge.getOrigin()==node||edge.getDestination()==node) || (edge.getOrigin()==otherNode||edge.getDestination()==otherNode)) { return true; } } return false; } public void setEdges(List<E> edges) { this.edges = edges; } public void addEdge(E edge) { this.edges.add(edge); } public void clear() { nodes.clear(); edges.clear(); } public List<Node<T>> neighbors(Node<T> node) { Node<T> parent = node.getParent(); List<Node<T>> neighbors = new ArrayList<Node<T>>(); if(parent == null) { return neighbors; } for(E edge:getEdges(node)) { Node<T> origin = edge.getOrigin(); if(!neighbors.contains(origin)) { neighbors.add(origin); } Node<T> destination = edge.getDestination(); if(!neighbors.contains(destination)) { neighbors.add(destination); } } return neighbors; } public boolean isEmpty() { return nodes.size() == 0; } public void moveNodes(int x, int y) { for(Node<T> node: nodes) { node.getPoint().setOffset(x, y); } } }