diff --git a/com/xgiovio/ListPartitionTest.java b/com/xgiovio/ListPartitionTest.java new file mode 100644 index 0000000..23201bd --- /dev/null +++ b/com/xgiovio/ListPartitionTest.java @@ -0,0 +1,48 @@ +package com.xgiovio; + +import partition.ListPartition; +import position.NodePositionList; +import set.OrderedListSet; +import set.Set; + +/** + * Created with MONSTER. + * User: xgiovio + * Date: 18/05/2014 + * Time: 15:58 + */ +public class ListPartitionTest { + + public static void main(String[] args) { + + ListPartition a = new ListPartition() ; + + + Set a1 = a.makeSet("1"); + System.out.println(a); + Set a2 = a.makeSet("2"); + System.out.println(a); + Set a3 = a.makeSet("3"); + System.out.println(a); + Set a4 = a.makeSet("4"); + System.out.println(a); + + Set out; + out = a.union(a1,a2); + System.out.println(a); + out = a.union(out,a3); + System.out.println(a); + out = a.union(out,a4); + System.out.println(a); + + + + + + + + + + + } +} diff --git a/graph/AdjacencyListGraph.java b/graph/AdjacencyListGraph.java index 895a1d1..30f6543 100644 --- a/graph/AdjacencyListGraph.java +++ b/graph/AdjacencyListGraph.java @@ -15,25 +15,29 @@ import java.util.Iterator; * @author Roberto Tamassia, Eric Zamore */ + /* public class AdjacencyListGraph implements Graph { protected NodePositionList> VList; // container for vertices protected NodePositionList> EList; // container for edges - /** Default constructor that creates an empty graph */ + + // Default constructor that creates an empty graph public AdjacencyListGraph() { VList = new NodePositionList>(); EList = new NodePositionList>(); } - /** Return an iterator over the vertices of the graph */ + + // Return an iterator over the vertices of the graph public Iterable> vertices() { return VList; } - /** Return an iterator over the edges of the graph */ + + // Return an iterator over the edges of the graph public Iterable> edges() { return EList; } - /** Replace the element a given position (vertex or edge) with a new - element and return the old element */ + + // Replace the element a given position (vertex or edge) with a new element and return the old element public Object replace(Position p, Object o) throws InvalidPositionException { MyPosition pp = checkPosition(p); @@ -41,20 +45,23 @@ public class AdjacencyListGraph implements Graph { pp.setElement(o); return temp; } - /** Return an iterator over the edges incident on a vertex */ + + // Return an iterator over the edges incident on a vertex public Iterable> incidentEdges(Vertex v) throws InvalidPositionException { MyVertex vv = checkVertex(v); return vv.incidentEdges(); } - /** Return the endvertices of a edge in an array of length 2 */ + + // Return the endvertices of a edge in an array of length 2 public Vertex[] endVertices(Edge e) throws InvalidPositionException { MyEdge ee = checkEdge(e); return ee.endVertices(); } - /** Return the other endvertex of an incident edge */ + + // Return the other endvertex of an incident edge public Vertex opposite(Vertex v, Edge e) throws InvalidPositionException { checkVertex(v); @@ -67,7 +74,8 @@ public class AdjacencyListGraph implements Graph { else throw new InvalidPositionException("No such vertex exists"); } - /** Test whether two vertices are adjacent */ + + // Test whether two vertices are adjacent public boolean areAdjacent(Vertex u, Vertex v) throws InvalidPositionException { // search the incidence list of the vertex with smaller degree @@ -86,7 +94,8 @@ public class AdjacencyListGraph implements Graph { } return false; } - /** Insert and return a new vertex with a given element */ + + // Insert and return a new vertex with a given element public Vertex insertVertex(V o) { MyVertex vv = new MyVertex(o); VList.addLast(vv); @@ -94,8 +103,8 @@ public class AdjacencyListGraph implements Graph { vv.setLocation(p); return vv; } - /** Insert and return a new edge with a given element between two - vertices */ + + // Insert and return a new edge with a given element between two vertices public Edge insertEdge(Vertex v, Vertex w, E o) throws InvalidPositionException { MyVertex vv = checkVertex(v); @@ -109,8 +118,8 @@ public class AdjacencyListGraph implements Graph { ee.setLocation(pe); return ee; } - /** Remove a vertex and all its incident edges and return the - element stored at the removed vertex */ + + // Remove a vertex and all its incident edges and return the element stored at the removed vertex public V removeVertex(Vertex v) throws InvalidPositionException { MyVertex vv = checkVertex(v); @@ -123,7 +132,8 @@ public class AdjacencyListGraph implements Graph { VList.remove(vv.location()); return v.element(); } - /** Remove an edge and return its element */ + + // Remove an edge and return its element public E removeEdge(Edge e) throws InvalidPositionException { MyEdge ee = checkEdge(e); @@ -138,13 +148,13 @@ public class AdjacencyListGraph implements Graph { // Auxiliary methods - /** Return the degree of a given vertex */ + // Return the degree of a given vertex public int degree(Vertex v) { MyVertex vv = checkVertex(v); return vv.degree(); } - /** Determines whether a given position is valid. */ + // Determines whether a given position is valid. protected MyPosition checkPosition(Position p) throws InvalidPositionException { if (p == null || !(p instanceof MyPosition)) @@ -152,7 +162,7 @@ public class AdjacencyListGraph implements Graph { return (MyPosition) p; } - /** Determines whether a given vertex is valid. */ + // Determines whether a given vertex is valid. protected MyVertex checkVertex(Vertex v) throws InvalidPositionException { if (v == null || !(v instanceof MyVertex)) @@ -160,7 +170,7 @@ public class AdjacencyListGraph implements Graph { return (MyVertex) v; } - /** Determines whether a given edge is valid. */ + // Determines whether a given edge is valid. protected MyEdge checkEdge(Edge e) throws InvalidPositionException { if (e == null || !(e instanceof MyEdge)) @@ -168,24 +178,22 @@ public class AdjacencyListGraph implements Graph { return (MyEdge) e; } - /** Implementation of a decorable position by means of a hash - * table. */ + // Implementation of a decorable position by means of a hash table. protected static class MyPosition extends HashTableMap implements DecorablePosition { - /** The element stored at this position. */ + // The element stored at this position. protected T elem; - /** Returns the element stored at this position. */ + // Returns the element stored at this position. public T element() { return elem; } - /** Sets the element stored at this position. */ + // Sets the element stored at this position. public void setElement(T o) { elem = o; } } - /** Returns a string representation of the vertex and edge lists, - * separated by a newline. */ + // Returns a string representation of the vertex and edge lists, separated by a newline. public String toString() { return VList.toString() + "\n" + EList.toString(); } @@ -212,70 +220,65 @@ public class AdjacencyListGraph implements Graph { return temp; } - /** Implementation of a vertex for an undirected adjacency list - * graph. Each vertex stores its incidence container and position - * in the vertex container of the graph. */ + //Implementation of a vertex for an undirected adjacency list + //graph. Each vertex stores its incidence container and position + //in the vertex container of the graph. protected class MyVertex extends MyPosition implements Vertex { - /** Incidence container of the vertex. */ + // Incidence container of the vertex. protected PositionList> incEdges; - /** Position of the vertex in the vertex container of the graph. */ + // Position of the vertex in the vertex container of the graph. protected Position> loc; - /** Constructs the vertex with the given element. */ + // Constructs the vertex with the given element. MyVertex(V o) { elem = o; incEdges = new NodePositionList>(); } - /** Return the degree of a given vertex */ + // Return the degree of a given vertex public int degree() { return incEdges.size(); } - /** Returns the incident edges on this vertex. */ + // Returns the incident edges on this vertex. public Iterable> incidentEdges() { return incEdges; } - /** Inserts an edge into the incidence container of this vertex. */ + // Inserts an edge into the incidence container of this vertex. public Position> insertIncidence(Edge e) { incEdges.addLast(e); return incEdges.last(); } - /** Removes an edge from the incidence container of this vertex. */ + //Removes an edge from the incidence container of this vertex. public void removeIncidence(Position> p) { incEdges.remove(p); } - /** Returns the position of this vertex in the vertex container of - * the graph. */ + // Returns the position of this vertex in the vertex container of the graph. public Position> location() { return loc; } - /** Sets the position of this vertex in the vertex container of - * the graph. */ + // Sets the position of this vertex in the vertex container of the graph. public void setLocation(Position> p) { loc = p; } - /** Returns a string representation of the element stored at this - * vertex. */ + // Returns a string representation of the element stored at this vertex. public String toString() { return elem.toString(); } } - /** Implementation of an edge for an undirected adjacency list - * graph. Each edge stores its endpoints (end vertices), its - * positions within the incidence containers of its endpoints, and - * position in the edge container of the graph. */ + // Implementation of an edge for an undirected adjacency list + // graph. Each edge stores its endpoints (end vertices), its + // positions within the incidence containers of its endpoints, and + // position in the edge container of the graph. protected class MyEdge extends MyPosition implements Edge { - /** The end vertices of the edge. */ + // The end vertices of the edge. protected MyVertex[] endVertices; - /** The positions of the entries for the edge in the incidence - * containers of the end vertices. */ + // The positions of the entries for the edge in the incidence containers of the end vertices. protected Position>[] Inc; - /** The position of the edge in the edge container of the - * graph. */ + // The position of the edge in the edge container of the graph. protected Position> loc; - /** Constructs an edge with the given endpoints and elements. */ + // Constructs an edge with the given endpoints and elements. MyEdge (Vertex v, Vertex w, E o) { elem = o; endVertices = (MyVertex[]) new MyVertex[2]; @@ -283,38 +286,37 @@ public class AdjacencyListGraph implements Graph { endVertices[1] = (MyVertex)w; Inc = (Position>[]) new Position[2]; } - /** Returns the end vertices of the edge. There are always two - * elements in the returned array. */ + + // Returns the end vertices of the edge. There are always two elements in the returned array. public MyVertex[] endVertices() { return endVertices; } - /** Returns the positions of the edge in the incidence containers - * of its end vertices. The returned array always contains two - * elements. */ + + // Returns the positions of the edge in the incidence containers + // of its end vertices. The returned array always contains two + // elements. public Position>[] incidences() { return Inc; } - /** Sets the positions of the edge in the incidence containers of - * its end vertices. */ + // Sets the positions of the edge in the incidence containers of its end vertices. public void setIncidences(Position> pv, Position> pw) { Inc[0] = pv; Inc[1] = pw; } - /** Returns the position of the edge in the edge container of the - * graph. */ + // Returns the position of the edge in the edge container of the graph. public Position> location() { return loc; } - /** Sets the position of the edge in the edge container of the - * graph. */ + // Sets the position of the edge in the edge container of the graph. public void setLocation(Position> p) { loc = p; } - /** Returns a string representation of the edge via a tuple of - * vertices. */ + // Returns a string representation of the edge via a tuple of vertices. public String toString() { return element() + "(" + endVertices[0].toString() + "," + endVertices[1].toString() + ")"; } } -} \ No newline at end of file +} + +*/ \ No newline at end of file diff --git a/partition/ListPartition.java b/partition/ListPartition.java index 448e083..64501c7 100644 --- a/partition/ListPartition.java +++ b/partition/ListPartition.java @@ -1,6 +1,14 @@ package partition; +import map.HashTableMap; +import position.NodePositionList; +import position.PositionList; +import set.OrderedListSet; import set.Set; +import utility.DefaultComparator; + +import java.security.InvalidKeyException; +import java.util.Iterator; /** * Created with xgiovio.macbookair. @@ -10,30 +18,91 @@ import set.Set; */ public class ListPartition implements Partition { + private HashTableMap> elementi; + private PositionList> partizione; + + public ListPartition () { + elementi = new HashTableMap>(); + partizione = new NodePositionList>(); + } + @Override public int size() { - return 0; + return elementi.size(); } @Override public boolean isEmpty() { - return false; + return (size() == 0 ); } @Override public Set makeSet(E x) { + try { + OrderedListSet o = new OrderedListSet(x, new DefaultComparator()); + elementi.put(x, o); + partizione.addLast(o); + o.setLocation(partizione.last()); + return o; + } + catch (InvalidKeyException e){ + + } return null; + } @Override public Set union(Set A, Set B) { + try { + if (A.size() > B.size()){ + OrderedListSet AA = (OrderedListSet) A; + OrderedListSet BB = (OrderedListSet) B; + AA.fastUnion(BB); + partizione.remove(BB.location()); + BB.setLocation(null); + Iterator it = BB.list().iterator(); + for (;it.hasNext();) + elementi.put(it.next(),AA); + return AA; + + } else { + + OrderedListSet AA = (OrderedListSet) B; + OrderedListSet BB = (OrderedListSet) A; + AA.fastUnion(BB); + partizione.remove(BB.location()); + BB.setLocation(null); + Iterator it = BB.list().iterator(); + for (;it.hasNext();) + elementi.put(it.next(),AA); + return AA; + + + } + } + catch (InvalidKeyException e){ + + } return null; + } @Override public Set find(E x) { + try { + return elementi.get(x); + } + catch (InvalidKeyException e){ + + } return null; } + + @Override + public String toString() { + return partizione.toString(); + } } diff --git a/set/OrderedListSet.java b/set/OrderedListSet.java index bf5d8dd..b06f757 100644 --- a/set/OrderedListSet.java +++ b/set/OrderedListSet.java @@ -1,11 +1,13 @@ package set; import position.NodePositionList; +import position.Position; import position.PositionList; import utility.DefaultComparator; import utility.merge.MergeTemplate; import java.util.Comparator; +import java.util.Iterator; /** * Created with xgiovio.macbookair. @@ -17,6 +19,7 @@ import java.util.Comparator; public class OrderedListSet implements Set { private Comparator c; private PositionList L; + private Position> loc; @@ -99,8 +102,33 @@ public class OrderedListSet implements Set { + public Set fastUnion(Set B){ + OrderedListSet BB = (OrderedListSet) B; + Iterator it = BB.L.iterator(); + for (;it.hasNext();) + L.addLast(it.next()); + return this; + } + public E fastInsert(E x) { + L.addLast(x); + return x; + } + + + public Position> location (){ + return loc; + } + + public void setLocation (Position> in){ + loc = in; + } + + public PositionList list (){ + return L; + } + //////////////////////// inner class override methods from merge template /////