Select a Chapter: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Back to the Main Page
Chapter Eighteen listings: 15 classes and 2 interfaces

SUMMARY SHEET FOR CHAPTER EIGHTEEN

public interface PriQue              // not in the Sun library
{    public boolean isEmpty();
     public Object peekMin();
     public Object removeMin();
     public void add (Object ob);
}
public class Ascendor implements java.util.Comparator
{     public int compare (Object one, Object two)
}
public class ArrayOutPriQue implements PriQue
{    private Object[] itsItem = new Object[10];
     private int itsSize = 0;
     private java.util.Comparator itsTest;
     public ArrayOutPriQue (java.util.Comparator givenTest)
     public ArrayOutPriQue()
     // PLUS ALL FOUR PriQue METHODS
}
public class ArrayInPriQue implements PriQue
{    private Object[] itsItem = new Object[10];
     private int itsSize = 0;
     private java.util.Comparator itsTest;
     public ArrayInPriQue (java.util.Comparator givenTest)
     public ArrayInPriQue()
     private int searchMin()
     // PLUS ALL FOUR PriQue METHODS
}
public class NodeOutPriQue implements PriQue
{    private Node itsFirst = new Node (null, null); // trailer node
     private java.util.Comparator itsTest;
     public NodeOutPriQue (java.util.Comparator givenTest)
     public NodeOutPriQue()
     public int size()
     public String toString()
     private static class Node 
     {    public Object itsData;
          public Node itsNext;
          public Node (Object data, Node next)
     }    //======================
     // PLUS ALL FOUR PriQue METHODS
}
public class NodeInPriQue implements PriQue
{    private Node itsFirst = new Node (null, null); // trailer node
     private java.util.Comparator itsTest;
     public NodeInPriQue (java.util.Comparator givenTest)
     public NodeInPriQue()
     private Node searchMin()
     public int size()
     public String toString()
     private static class Node 
     {    public Object itsData;
          public Node itsNext;
          public Node (Object data, Node next)
     }    //======================
     // PLUS ALL FOUR PriQue METHODS
}
public class NodeGroupPriQue implements PriQue
{    private Node itsFirst = new Node (null, null); // trailer node
     private java.util.Comparator itsTest;
     public NodeGroupPriQue (java.util.Comparator givenTest)
     public NodeGroupPriQue()
     private static class Node 
     {    public QueueADT itsData;
          public Node itsNext;
          public Node (QueueADT data, Node next)
     }    //======================
     // PLUS ALL FOUR PriQue METHODS
}
public class TreePriQue implements PriQue
{    private TreeNode itsRoot = TreeNode.ET;
     private java.util.Comparator itsTest;
     public TreePriQue (java.util.Comparator givenTest)
     public TreePriQue()
     // PLUS ALL FOUR PriQue METHODS
}
public class TreeNode
{    public static final TreeNode ET = new TreeNode (null); 
     private Object itsData;  // the data value stored in this tree
     private TreeNode itsLeft  = ET; // left subtree of this tree
     private TreeNode itsRight = ET; // right subtree of this tree 
     public TreeNode (Object given)
     public boolean isEmpty()
     public TreeNode firstNode()  
     public Object getData()
     public Object removeFirst (TreeNode[] root)
     public void add (Object ob, java.util.Comparator test)
     public void inorderTraverseLR (QueueADT queue)
}
public class HeapPriQue implements PriQue
{    private Object[] itsItem = new Object[10];
     private int itsSize = 0;
     private java.util.Comparator itsTest;
     public HeapPriQue (java.util.Comparator givenTest)
     public HeapPriQue()
     private void siftDown (Object toInsert)
     // PLUS ALL FOUR PriQue METHODS
}



public interface PriQue              // not in the Sun library
{
          /** Tell whether the priority queue has no more elements. */

     public boolean isEmpty();


          /** Return the object removeMin would return without modifying
           *  anything.  Throw an Exception if the queue is empty. */

     public Object peekMin();


          /** Delete the object of highest priority and return it.  
           *  Priority is determined by a Comparator passed to the
           *  constructor.  Throw an Exception if the queue is empty. */

     public Object removeMin();


          /** Add the given element ob to the priority queue, so the
           *  priority queue has one more element than it had before.
           *  Precondition: The Comparator can be applied to ob. */

     public void add (Object ob);
}


public class Ascendor implements java.util.Comparator
{
     public int compare (Object one, Object two)
     {    return ((Comparable) one).compareTo (two);
     }    //=======================
}


public class HuffmanCompare implements java.util.Comparator
{
     public int compare (Object one, Object two)
     {    return ((Integer) ((TreeNode) one).getData()).intValue()
               - ((Integer) ((TreeNode) two).getData()).intValue();
     }    //=======================
}


public class ByCost implements java.util.Comparator
{
     public int compare (Object one, Object two)
     {    return ((Priceable) two).getCost() 
               - ((Priceable) one).getCost();
     }    //=======================
}


public interface Priceable
{         public int getCost();
}


public class ArrayOutPriQue implements PriQue
{
     private Object[] itsItem = new Object[10];
     private int itsSize = 0;
     private java.util.Comparator itsTest;


     public ArrayOutPriQue (java.util.Comparator givenTest)
     {    itsTest = givenTest;                                   //1
     }    //=======================


     public ArrayOutPriQue()
     {    itsTest = new Ascendor();                              //2
     }    //=======================


     public boolean isEmpty()
     {    return itsSize == 0;                                   //3
     }    //=======================


     public Object peekMin()
     {    if (isEmpty())                                         //4
               throw new IllegalStateException ("priority Q is empty");
          return itsItem[itsSize - 1];                           //6
     }    //=======================


     public Object removeMin()
     {    if (isEmpty())                                         //7
               throw new IllegalStateException ("priority Q is empty");
          itsSize--;                                             //9
          return itsItem[itsSize];                               //10
     }    //=======================


     public void add (Object ob)
     {    if (itsSize == itsItem.length)                         //11
          {    Object[] toDiscard = itsItem;
               itsItem = new Object [itsItem.length * 2];
               for (int k = 0;  k < itsSize;  k++)
                    itsItem[k] = toDiscard[k];
          }
          int k = itsSize;                                       //13
          while (k > 0 && itsTest.compare (ob, itsItem[k - 1]) >= 0)
          {    itsItem[k] = itsItem[k - 1];                      //15
               k--;                                              //16
          }                                                      //17
          itsItem[k] = ob;                                       //18
          itsSize++;                                             //19
     }    //=======================
}


public class ArrayInPriQue implements PriQue
{
     private Object[] itsItem = new Object[10];
     private int itsSize = 0;
     private java.util.Comparator itsTest;


     public ArrayInPriQue (java.util.Comparator givenTest)
     {    itsTest = givenTest;
     }    //=======================


     public ArrayInPriQue()
     {    itsTest = new Ascendor();
     }    //=======================


     public boolean isEmpty()
     {    return itsSize == 0;
     }    //=======================


     public Object peekMin()
     {    return itsItem[searchMin()];                           //1
     }    //=======================


     private int searchMin()
     {    if (isEmpty())                                         //2
               throw new IllegalStateException ("priority Q is empty");
          int best = 0;                                          //4
          for (int k = 1;  k < itsSize;  k++)                    //5
          {    if (itsTest.compare (itsItem[k], itsItem[best]) < 0)//6
                    best = k;                                    //7
          }                                                      //8
          return best;                                           //9
     }    //=======================


     public Object removeMin()
     {    int best = searchMin();                                //10
          itsSize--;                                             //11
          Object valueToReturn = itsItem[best];                  //12
          itsItem[best] = itsItem[itsSize];                      //13
          return valueToReturn;                                  //14
     }    //=======================


     public void add (Object ob)
     {    if (itsSize == itsItem.length)
          {    Object[] toDiscard = itsItem;
               itsItem = new Object [itsItem.length * 2];
               for (int k = 0;  k < itsSize;  k++)
                    itsItem[k] = toDiscard[k];
          }
          itsItem[itsSize] = ob;
          itsSize++;
     }    //=======================
}


public class NodeOutPriQue implements PriQue
{
     private Node itsFirst = new Node (null, null); // trailer node
     private java.util.Comparator itsTest;


     public NodeOutPriQue (java.util.Comparator givenTest)
     {    itsTest = givenTest;
     }    //=======================


     public NodeOutPriQue()
     {    itsTest = new Ascendor();
     }    //=======================


     public boolean isEmpty()
     {    return itsFirst.itsNext == null;                       //1
     }    //=======================


     public Object peekMin()
     {    if (isEmpty())
               throw new IllegalStateException ("priority Q is empty");
          return itsFirst.itsData;
     }    //=======================


     public Object removeMin()
     {    if (isEmpty())                                         //2
               throw new IllegalStateException ("priority Q is empty");
          Node toDiscard = itsFirst;                             //4
          itsFirst = itsFirst.itsNext;                           //5
          return toDiscard.itsData;                              //6
     }    //=======================


     public void add (Object ob)
     {    Node p = this.itsFirst;                                //7
          while (p.itsNext != null                               //8
                        && itsTest.compare (ob, p.itsData) >= 0) //9
          {    p = p.itsNext;                                    //10
          }                                                      //11
          p.itsNext = new Node (p.itsData, p.itsNext);           //12
          p.itsData = ob;                                        //13
     }    //=======================


     public int size()
     {    int count = 0;
          for (Node p = itsFirst;  p.itsNext != null;  p = p.itsNext)
               count++;
          return count;
     }    //=======================


     public String toString()
     {    String valueToReturn = "";
          for (Node p = itsFirst;  p.itsNext != null;  p = p.itsNext)
               valueToReturn += '\t' + p.itsData.toString();
          return valueToReturn;
     }    //=======================


     public void removeAbove (Object ob)   // in NodeOutPriQue
     {    while (itsFirst.itsNext != null 
                             && itsTest.compare (itsFirst.itsData, ob) > 0)
               itsFirst = itsFirst.itsNext;
     }


     private static class Node 
     {
          public Object itsData;
          public Node itsNext;

          public Node (Object data, Node next)
          {    itsData = data;                                     //14
               itsNext = next;                                     //15
          }
     }    //======================
}


public class NodeInPriQue implements PriQue
{
     private Node itsFirst = new Node (null, null); // trailer node
     private java.util.Comparator itsTest;


     public NodeInPriQue (java.util.Comparator givenTest)
     {    itsTest = givenTest;
     }    //=======================


     public NodeInPriQue()
     {    itsTest = new Ascendor();
     }    //=======================


     public boolean isEmpty()
     {    return itsFirst.itsNext == null;                       //1
     }    //=======================


     public Object peekMin()
     {    return searchMin().itsData;                            //2
     }    //=======================


     private Node searchMin()
     {    Node best = itsFirst;                                  //3
          for (Node p = itsFirst.itsNext;  p.itsNext != null;    //4
                                           p = p.itsNext)        //5
          {    if (itsTest.compare (p.itsData, best.itsData) <= 0) //6
                    best = p;                                    //7
          }                                                      //8
          return best;                                           //9
     }    //=======================


     public Object removeMin()
     {    Node best = searchMin();                               //10
          Object valueToReturn = best.itsData;                   //11
          Node toDiscard = best.itsNext;                         //12
          best.itsData = toDiscard.itsData;                      //13
          best.itsNext = toDiscard.itsNext;                      //14
          return valueToReturn;                                  //15
     }    //=======================


     public void add (Object ob)
     {    itsFirst = new Node (ob, itsFirst);                    //16
     }    //=======================


     public void removeAbove (Object ob)   // in NodeInPriQue
     {    Node p = itsFirst;
          while (p.itsNext.itsNext != null)  //so next node has data to compared
          {    if (itsTest.compare (p.itsNext.itsData, ob) < 0)
                    p.itsNext = p.itsNext.itsNext;
               else
                    p = p.itsNext;
          }
          if ( ! isEmpty() && itsTest.compare (itsFirst.itsData, ob) < 0)
               itsFirst = itsFirst.itsNext;
     }


     private static class Node 
     {
          public Object itsData;
          public Node itsNext;

          public Node (Object data, Node next)
          {    itsData = data;                                     //14
               itsNext = next;                                     //15
          }
     }    //======================
}


public class NodeGroupPriQue implements PriQue
{
     private Node itsFirst = new Node (null, null); // trailer node
     private java.util.Comparator itsTest;


     public NodeGroupPriQue (java.util.Comparator givenTest)
     {    itsTest = givenTest;
     }    //=======================


     public NodeGroupPriQue()
     {    itsTest = new Ascendor();
     }    //=======================


     public boolean isEmpty()
     {    return itsFirst.itsNext == null;                       //1
     }    //=======================


     public Object peekMin()
     {    return itsFirst.itsData.peekFront();                   //2
     }    //=======================


     public Object removeMin()
     {    Object valueToReturn = itsFirst.itsData.dequeue();     //3
          if (itsFirst.itsData.isEmpty())  // after the dequeue  //4
               itsFirst = itsFirst.itsNext;  // lose the queue   //5
          return valueToReturn;
     }    //=======================


     public void add (Object ob)
     {    Node p = this.itsFirst;                                //6
          while (p.itsNext != null                               //7
                 && itsTest.compare (ob, p.itsData.peekFront()) > 0)
          {    p = p.itsNext;                                    //9
          }                                                      //10
          if (p.itsNext == null                                  //11
                 || itsTest.compare (ob, p.itsData.peekFront()) < 0)
          {    p.itsNext = new Node (p.itsData, p.itsNext);      //13
               p.itsData = new NodeQueue();                      //14
          }                                                      //15
          p.itsData.enqueue (ob);                                //16
     }    //=======================


     private static class Node 
     {
          public QueueADT itsData;
          public Node itsNext;

          public Node (QueueADT data, Node next)
          {    itsData = data;                                   //17
               itsNext = next;                                   //18
          }
     }    //======================
}


public class CompOp2
{
     public static void sort (QueueADT source, PriQue piq)
     {    while ( ! source.isEmpty())                 // Loop #1
               piq.add (source.dequeue());
          while ( ! piq.isEmpty())                    // Loop #2
               source.enqueue (piq.removeMin());
     }


     public static void sort (Object[] source, PriQue piq)
     {    for (int k = source.length - 1;  k >= 0;  k++)  // Loop #1
               piq.add (source[k]);
          for (int k = 0;  k < source.length;  k++)       // Loop #2
               source[k] = piq.removeMin();
     }


     public static void treeSort (Comparable[] item, int size)
     {    if (size <= 1)
               return;
          java.util.Comparator itsTest = new Ascendor();
          TreeNode root = new TreeNode (item[0]);
          for (int k = 1;  k < size;  k++)
               root.add (item[k], itsTest);  // coded in Listing 18.9
          NodeQueue queue = new NodeQueue();
          root.inorderTraverseLR (queue);  // coded in Listing 17.9
          for (int k = 0;  k < size;  k++)
               item[k] = (Comparable) queue.dequeue();
     }    //=======================
}


public class TreePriQue implements PriQue
{
     private TreeNode itsRoot = TreeNode.ET;
     private java.util.Comparator itsTest;


     public TreePriQue (java.util.Comparator givenTest)
     {    itsTest = givenTest;
     }    //=======================


     public TreePriQue()
     {    itsTest = new Ascendor();
     }    //=======================


     public boolean isEmpty()
     {    return itsRoot.isEmpty();
     }    //=======================


     public Object peekMin()
     {    return itsRoot.firstNode().getData();
     }    //=======================


     public void add (Object ob)
     {    if (itsRoot == TreeNode.ET)
               itsRoot = new TreeNode (ob);
          else
               itsRoot.add (ob, itsTest);
     }    //=======================


     public Object removeMin()
     {    if (isEmpty())
               throw new IllegalStateException ("priority Q is empty");
          TreeNode[] newRoot = {itsRoot};
          Object valueToReturn = itsRoot.removeFirst (newRoot);
          itsRoot = newRoot[0];
          return valueToReturn;
     }    //=======================
}


public class TreeNode
{
     public static final TreeNode ET = new TreeNode (null); 
     private Object itsData;  // the data value stored in this tree
     private TreeNode itsLeft  = ET; // left subtree of this tree
     private TreeNode itsRight = ET; // right subtree of this tree 


     public TreeNode (Object given)
     {    itsData = given;
     }    //========================


     /** Return whether this is an empty tree. */
     // AVG EXECUTION TIME is O(1): it executes just 1 statement.

     public boolean isEmpty()
     {    return this.itsData == null;     // generally, only ET
     }    //========================


     /** Precondition: this is an internal node (i.e., not empty). 
         Return the leftmost node in the tree rooted at this. */
     // AVG EXECUTION TIME O(log(N)): navigates only 1 path down the tree.

     public TreeNode firstNode()  
     {    return itsLeft.isEmpty()  ?  this : itsLeft.firstNode();
     }    //========================


     public Object getData()
     {    return itsData;
     }    //======================


     /** Delete and return the first data value in a non-empty 
      *  tree.  If that data value is in the executor, assign
      *  to root the TreeNode to the executor's right. */

     public Object removeFirst (TreeNode[] root)
     {    if (itsLeft == ET)                                 //1
          {    root[0] = this.itsRight;                      //2
               return this.itsData;                          //3
          }                                                  //4
          TreeNode p = this;                                 //5
          while (p.itsLeft.itsLeft != ET)                    //6
               p = p.itsLeft;                                //7
          Object valueToReturn = p.itsLeft.itsData;          //8
          p.itsLeft = p.itsLeft.itsRight;                    //9
          return valueToReturn;                              //10
     }    //=======================


     /** Add ob to the tree, maintaining binary search property. 
      *  Precondition:  this is not an empty tree.  */

     public void add (Object ob, java.util.Comparator test)
     {    if (test.compare (ob, itsData) < 0)                //11
          {    if (itsLeft == ET)                            //12
                    itsLeft = new TreeNode (ob);             //13
               else                                          //14
                    itsLeft.add (ob, test);                  //15
          }                                                  //16
          else                                               //17
          {    if (itsRight == ET)                           //18
                    itsRight = new TreeNode (ob);            //19
               else                                          //20
                    itsRight.add (ob, test);                 //21
          }                                                  //22
     }    //=======================


     /** Add to the given queue all data values in the standard
      *  left-to-right inorder traversal. */
         // AVG EXECUTION TIME is O(N): it goes through every node in the tree.

     public void inorderTraverseLR (QueueADT queue)
     {    if (isEmpty())
               return;
          itsLeft.inorderTraverseLR (queue);
          queue.enqueue (itsData);
          itsRight.inorderTraverseLR (queue);
     }    //========================
}


public class HeapPriQue implements PriQue
{
     private Object[] itsItem = new Object[10];
     private int itsSize = 0;
     private java.util.Comparator itsTest;


     public HeapPriQue (java.util.Comparator givenTest)
     {    itsTest = givenTest;                                   
     }    //=======================


     public HeapPriQue()
     {    itsTest = new Ascendor();                              
     }    //=======================


     public boolean isEmpty()
     {    return itsSize == 0;                                   
     }    //=======================


     public Object peekMin()
     {    if (isEmpty())                                         //1
               throw new IllegalStateException ("priority Q is empty");
          return itsItem[0];                                     //3
     }    //=======================


     public void add (Object ob)
     {    if (itsSize == itsItem.length)                         //4
          {  }    // left as an exercise in an earlier section   //5
          int k = itsSize;                                       //6
          while (k > 0 && itsTest.compare (ob,                   //7
                                  itsItem[(k - 1) / 2]) < 0)     //8
          {    itsItem[k] = itsItem[(k - 1) / 2];                //9
               k = (k - 1) / 2;                                  //10
          }                                                      //11
          itsItem[k] = ob;                                       //12
          itsSize++;                                             //13
     }    //=======================


     public Object removeMin()
     {    if (isEmpty())                                         //14
               throw new IllegalStateException ("priority Q is empty");
          Object valueToReturn = itsItem[0];                     //16
          itsSize--;                                             //17
          if (itsSize >= 2)                                      //18
               siftDown (itsItem[itsSize]);                      //19
          else if (itsSize == 1)                                 //20
               itsItem[0] = itsItem[1];                          //21
          return valueToReturn;                                  //22
     }    //=======================


     /** Given that itsItem[0]..itsItem[itsSize] is a max-heap, 
      *  in effect replace itsItem[0] by toInsert and then make
      *  the minimal changes to swap toInsert down so that 
      *  itsItem[0]...itsItem[itsSize-1] is a max-heap again.  */

     private void siftDown (Object toInsert)
     {    int empty = 0;                                             //1
          int kid = 1;             // empty's child on the left      //2
          while (kid < itsSize)    // there are two children         //3
          {    if (itsTest.compare (itsItem[kid + 1],                //4
                                    itsItem[kid]) < 0)               //5
                    kid++;             // use the child on the right //6
               if (itsTest.compare (toInsert, itsItem[kid]) < 0)     //7
               {    itsItem[empty] = toInsert;                       //8
                    return;                                          //9
               }                                                     //10
               itsItem[empty] = itsItem[kid];                        //11
               empty = kid;                                          //12
               kid = 2 * empty + 1;  // empty's child on the left    //13
          }                                                          //14
          itsItem[empty] = toInsert;                                 //15
     }    //=======================
}


public class Node
{
     private Object itsData;
     private Node itsNext;


     public void sort()
     {    itsNext = sorted (itsNext, size());                    //1
     }    //=======================


     private Node sorted (Node item, int size)
     {    if (size < 2)                                          //2
               return item;                                      //3
          int halfSize = size / 2;                               //4
          Node end = item;                                       //5
          for (int k = 1;  k < halfSize;  k++)                   //6
               end = end.itsNext;                                //7
          Node secondHalf = end.itsNext;                         //8
          end.itsNext = null;                                    //9
          return merged (sorted (item, halfSize),                //10
                         sorted (secondHalf, size - halfSize));  //11
     }    //=======================


     private Node merged (Node one, Node two)
     {    Node rear = this;  // last node of sorted              //12
          while (one != null && two != null)                     //13
          {    if (((Comparable) one.itsData)                    //14
                             .compareTo (two.itsData) <= 0)      //15
               {    rear.itsNext = one;                          //16
                    one = one.itsNext;                           //17
               }                                                 //18
               else                                              //19
               {    rear.itsNext = two;                          //20
                    two = two.itsNext;                           //21
               }                                                 //22
               rear = rear.itsNext;                              //23
          }                                                      //24
          rear.itsNext = (one == null)  ?  two  :  one;          //25
          return this.itsNext;                                   //26
     }    //=======================


     public int size()
     {    return itsNext == null  ?  0  :  1 + itsNext.size();
     }    //=======================
}


public class ManyFilesMerger
{
     private ObjectFile itsInFile;  // the original unsorted input
     private ObjectFile itsOutFile; // the final sorted output
     private HeapPriQue itsData = new HeapPriQue();


     public ManyFilesMerger (String inf, String outf)
     {    itsInFile = new ObjectFile (inf);   // for output      //1
          itsInFile.openForInput();        // but we need input  //2
          itsOutFile = new ObjectFile (outf); // for output      //3
     } //================================================


     /** Step 1:  Make many files, each sorted. */

     public void makeSortedFiles (int maxToSort)  
     {    ObjectFileSorter sorter = new ObjectFileSorter (maxToSort);
          while ( ! itsInFile.isEmpty())                         //5
          {    ObjectFile tempFile = new ObjectFile ("");        //6
               sorter.readManyFromFile (itsInFile);              //7
               sorter.writeManyToFile (tempFile);                //8
               tempFile.openForInput();                          //9
               itsData.add (new Pair (tempFile.readObject(),tempFile));
          }                                                      //11
     } //================================================


     /** Step 2:  Merge the many files into just one sorted file.*/

     public void mergeFiles()  
     {    while ( ! itsData.isEmpty())                           //12
          {    Pair p = (Pair) itsData.removeMin();              //13
               itsOutFile.writeObject (p.itsData);               //14
               if (! p.itsFile.isEmpty())                        //15
               {    p.itsData = p.itsFile.readObject();          //16
                    itsData.add (p);                             //17
               }                                                 //18
          }                                                      //19
     } //================================================


     private static class Pair implements Comparable
     {    public Object itsData;
          public final ObjectFile itsFile;

          public Pair (Object data, ObjectFile file)
          {    itsData = data;                                   //20
               itsFile = file;                                   //21
          }

          public int compareTo (Object ob)
          {    return ((Comparable) this.itsData).compareTo      //22
                            (((Pair) ob).itsData);               //23
          }
     } //================================================
}

// 2 stubbed classes

public class ObjectFile  // for generic files of objects
{    // Open the file of that name for output; open a 
     // temporary file if the name is "". 
     public ObjectFile (String name)     {  } 
     // Add ob to the end of the file.
     public void writeObject (Object ob) {  } 
     // Change over to providing input, not output.
     public void openForInput()          {  }
     // Retrieve the next available object in the file.
     public Object readObject()          { return null; }
     // Switch back to providing output, not input.
     public void openForOutput()         {  }
     // Tell whether the input file has no more values.
     public boolean isEmpty()            { return false; }
}


public class ObjectFileSorter  // for sorters of ObjectFiles
{    // Create the object capable of holding max values. 
     public ObjectFileSorter (int max)                 {  }
    // Read max values from the given file, except stop reading 
    // at the end of the file.
     public void readManyFromFile (ObjectFile file)    {  }
    // Write all values you have to the given file in increasing 
    // order using compareTo.
     public void writeManyToFile (ObjectFile file)     {  }
}


public class FourFilesMerger
{
     private ObjectFile itsInFile;  // the original unsorted input
     private ObjectFile itsOutFile; // the final sorted output
     private ObjectFile one, two;   // two scratch files
     private Object itsSentinel; // sentinel value to mark the end


     public FourFilesMerger (String inf, String outf, Object sent)
     {    itsInFile = new ObjectFile (inf);   // for output     //1
          itsInFile.openForInput();       // but we need input  //2
          itsOutFile = new ObjectFile (outf); // for output     //3
          itsSentinel = sent;                                   //4
     } //================================================


     public void makeSortedFiles (int maxToSort)  
     {    ObjectFileSorter sorter = new ObjectFileSorter (maxToSort);
          one = new ObjectFile ("");          // for output     //6
          two = new ObjectFile ("");          // for output     //7
          while ( ! itsInFile.isEmpty())                        //8
          {    sorter.readManyFromFile (itsInFile);             //9
               sorter.writeManyToFile (one);                    //10
               one.writeObject (itsSentinel);                   //11
               if ( ! itsInFile.isEmpty())                      //12
               {    sorter.readManyFromFile (itsInFile);        //13
                    sorter.writeManyToFile (two);               //14
               }                                                //15
               two.writeObject (itsSentinel);                   //16
          }                                                     //17
     } //================================================


     public void mergeFiles()  
     {    if (one != null && ! one.isEmpty())                   //18
          {    one = mergeToOneFile (one, two,                  //19
                     new ObjectFile (""), new ObjectFile ("")); //20
               Object data = one.readObject();                  //21
               while ( ! one.isEmpty())                         //22
               {    itsOutFile.writeObject (data);              //23
                    data = one.readObject();                    //24
               }                                                //25
          }                                                     //26
     } //================================================


     /** Return a file containing all the values in increasing
      *  order, plus a sentinel at the end. */

     private ObjectFile mergeToOneFile (ObjectFile in1, 
             ObjectFile in2, ObjectFile out1, ObjectFile out2)
     {  return null;  // left as an exercise
     } //================================================
}

All information Copyright (c)1999 - Dr. William C. Jones, Jr.
Layout and Design Copyright © Psumonix, LLC. All Rights Reserved.