Author: simonetripodi Date: Thu Mar 1 14:39:20 2012 New Revision: 1295586 URL: http://svn.apache.org/viewvc?rev=1295586&view=rev Log: there's no needs of an Aux class that wraps the linked list
Modified: commons/sandbox/graph/trunk/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java Modified: commons/sandbox/graph/trunk/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java URL: http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java?rev=1295586&r1=1295585&r2=1295586&view=diff ============================================================================== --- commons/sandbox/graph/trunk/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java (original) +++ commons/sandbox/graph/trunk/src/main/java/org/apache/commons/graph/visit/DefaultVisitAlgorithmsSelector.java Thu Mar 1 14:39:20 2012 @@ -24,9 +24,7 @@ import static org.apache.commons.graph.u import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; -import java.util.Queue; import java.util.Set; -import java.util.Stack; import org.apache.commons.graph.DirectedGraph; import org.apache.commons.graph.Edge; @@ -76,7 +74,7 @@ final class DefaultVisitAlgorithmsSelect */ public <O> O applyingBreadthFirstSearch( GraphVisitHandler<V, E, G, O> handler ) { - return applyingSearch( handler, new QueueOrStack<V>( true ) ); + return applyingSearch( handler, true ); } /** @@ -84,7 +82,7 @@ final class DefaultVisitAlgorithmsSelect */ public <O> O applyingDepthFirstSearch( GraphVisitHandler<V, E, G, O> handler ) { - return applyingSearch( handler, new QueueOrStack<V>( false ) ); + return applyingSearch( handler, false ); } /** @@ -98,16 +96,18 @@ final class DefaultVisitAlgorithmsSelect * </ul> * * @param handler the handler intercepts visits - * @param vertexList the collection used to traverse the graph + * @param enqueue defines the collection behavior used to traverse the graph: true is a Queue, false is a Stack * @return the result of {@link GraphVisitHandler#onCompleted()} */ - private <O> O applyingSearch( GraphVisitHandler<V, E, G, O> handler, QueueOrStack<V> vertexList ) + private <O> O applyingSearch( GraphVisitHandler<V, E, G, O> handler, boolean enqueue ) { handler = checkNotNull( handler, "Graph visitor handler can not be null." ); handler.discoverGraph( graph ); - vertexList.push( new VertexPair<V>( source, source ) ); + final LinkedList<VertexPair<V>> vertexList = new LinkedList<VertexPair<V>>(); + + vertexList.addLast( new VertexPair<V>( source, source ) ); final Set<V> visitedVertices = new HashSet<V>(); visitedVertices.add( source ); @@ -116,7 +116,8 @@ final class DefaultVisitAlgorithmsSelect while ( visitingGraph && !vertexList.isEmpty() ) { - final VertexPair<V> pair = vertexList.pop(); + // if dequeue, remove the first element, otherwise the last + final VertexPair<V> pair = enqueue ? vertexList.removeFirst() : vertexList.removeLast(); final V v = pair.getHead(); final V prevHead = pair.getTail(); final E e = prevHead.equals( v ) ? null : graph.getEdge( prevHead, v ); @@ -148,7 +149,7 @@ final class DefaultVisitAlgorithmsSelect V w = connected.next(); if ( !visitedVertices.contains( w ) ) { - vertexList.push( new VertexPair<V>( w, v ) ); + vertexList.addLast( new VertexPair<V>( w, v ) ); visitedVertices.add( w ); } } @@ -165,63 +166,4 @@ final class DefaultVisitAlgorithmsSelect return handler.onCompleted(); } - /** - * A wrapper class around a {@link LinkedList} to provide a common - * interface for {@link Stack} or {@link Queue} implementations. The class - * is used to support a common algorithm for depth-first and breadth-first - * search, by switching from queue (FIFO) to stack (LIFO) behavior. - * - * @param <V> the Graph vertices type - */ - private static final class QueueOrStack<V extends Vertex> - { - /** indicated the collection behavior. */ - private boolean isQueue; - - /** the underlying linked list implementation. */ - private final LinkedList<VertexPair<V>> list; - - /** - * Create a new {@link QueueOrStack} instance with the desired - * behavior, indicated by <code>isQueue</code>. - * - * @param isQueue if <code>true</code> the collection behaves as a FIFO queue, - * otherwise as a LIFO stack. - */ - public QueueOrStack( final boolean isQueue ) - { - this.isQueue = isQueue; - this.list = new LinkedList<VertexPair<V>>(); - } - - /** - * Add an element to the collection. - * - * @param element the element to be added - */ - public void push( VertexPair<V> element ) - { - list.addLast( element ); - } - - /** - * Removes and returns the element from the collection according to the - * defined behavior (LIFO vs. FIFO). - * @return the next element - */ - public VertexPair<V> pop() - { - return isQueue ? list.removeFirst() : list.removeLast(); - } - - /** - * Returns <code>true</code> if the collection contains no elements. - * @return <code>true</code> if the collection is empty, <code>false</code> otherwise - */ - public boolean isEmpty() - { - return list.isEmpty(); - } - } - }