Advertisement
skilletwaffles

lab 33.1

Apr 21st, 2015
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.12 KB | None | 0 0
  1. import java.util.*;
  2. import chn.util.*;
  3. import apcslib.Format;
  4.  
  5. /**
  6. * Implements a recursive mergesort on a LinkedList data type
  7. *
  8. * @author G. Peck
  9. * @created July 18, 2002
  10. */
  11. public class MergeList
  12. {
  13. FileInput inFile;
  14.  
  15. /**
  16. * Open a file containing id/inventory pairs of data
  17. *
  18. * @param fileName File to be opened
  19. */
  20. public MergeList(String fileName)
  21. {
  22. inFile = new FileInput(fileName);
  23. }
  24.  
  25. /**
  26. * Reads a file containing id/inv data pairs. The first line of the
  27. * file contains the number of id/inventory integer pairs listed on
  28. * subsequent lines.
  29. *
  30. * @param list Reference to LinkedList to which data will be added
  31. */
  32. public void readData(LinkedList list)
  33. {
  34. int id;
  35. int inv;
  36.  
  37. int howMany = inFile.readInt();
  38. for (int k = 1; k <= howMany; k++)
  39. {
  40. id = inFile.readInt();
  41. inv = inFile.readInt();
  42. list.addFirst(new Item(id, inv));
  43. }
  44. }
  45.  
  46. /**
  47. * Prints contents of list
  48. *
  49. * @param list linked list to be printed
  50. */
  51. public void printList(LinkedList list)
  52. {
  53. Iterator iter = list.iterator();
  54.  
  55. System.out.println(Format.center("Id", 7) +
  56. Format.right("Inventory", 14));
  57. while (iter.hasNext())
  58. {
  59. Item temp = (Item) iter.next();
  60. System.out.println(Format.right(temp.getId(), 7) +
  61. Format.right(temp.getInv(), 10));
  62. }
  63. System.out.println();
  64. }
  65.  
  66. /**
  67. * Splits listA into two parts. listA retains the first
  68. * half of the list, listB contains the last half of
  69. * the original list.
  70. *
  71. * @param listA Original list. reduced by half after split.
  72. * @param listB Contains last half of the original list
  73. */
  74. public void split(LinkedList listA, LinkedList listB)
  75. {
  76. Iterator iterA = listA.iterator();
  77. iterA.next();
  78. int length = 0;
  79. while(iterA.hasNext())
  80. {
  81. length++;
  82. iterA.next();
  83. }
  84. Iterator iterB = listB.iterator();
  85. while(iterB.hasNext())
  86. {
  87. iterB.next();
  88. iterB.remove();
  89. iterB.next();
  90. }
  91. ListIterator listIterA = listA.listIterator(length/2);
  92.  
  93. ListIterator listIterB = listB.listIterator();
  94. while(listIterA.hasNext())
  95. {
  96. listIterB.add(listIterA);
  97. listIterA.remove();
  98. iterA.next();
  99. }
  100. }
  101.  
  102. /**
  103. * Two linked lists listA and listB are merged into a single
  104. * linked list mergedList. They are placed in mergedList starting
  105. * with the smallest item on either list and continue working up to
  106. * to largest item.
  107. *
  108. * @param listA LinkedList in nondecreasing order
  109. * @param listB LinkedList in nondecreasing order
  110. * @return List containing all the values from lists listA
  111. * and listB, in nondecreasing order
  112. */
  113. public LinkedList merge(LinkedList listA, LinkedList listB)
  114. {
  115. System.out.println("merge");
  116. LinkedList sorted = new LinkedList();
  117. Iterator iterA = listA.iterator();
  118. Iterator iterB = listB.iterator();
  119.  
  120. while(iterA.hasNext() && iterB.hasNext())
  121. {
  122. Item A = (Item) iterA;
  123. Item B = (Item) iterB;
  124. if(A.compareTo(B) < 0) // B is greater than A
  125. {
  126. sorted.add(A);
  127. }
  128. else if (A.compareTo(B) > 0) //A is greater than B
  129. {
  130. sorted.add(B);
  131. }
  132. iterA.next();
  133. iterB.next();
  134.  
  135. return listA;
  136. }
  137. if(iterA.hasNext() == false) //list a is empty
  138. {
  139. while(iterB.hasNext())
  140. {
  141. sorted.add(iterB);
  142. iterB.next();
  143. }
  144. }
  145. else if(iterB.hasNext() == false) //list b is empty
  146. {
  147. while(iterA.hasNext())
  148. {
  149. sorted.add(iterA);
  150. iterA.next();
  151. }
  152. }
  153. return sorted;
  154. }
  155.  
  156. /**
  157. * The linked list is returned in sorted order.
  158. * Sorted order has the smallest item first and the largest item
  159. * last. The ordering is determined by the order defined in the
  160. * Comparable class. The method uses the merge sort technique and
  161. * must be recursive.
  162. *
  163. * @param listA LinkedList to be sorted
  164. * @return LinkedList in sorted (nondecreasing) order
  165. */
  166. public LinkedList mergeSort(LinkedList listA)
  167. {
  168. LinkedList listB = new LinkedList();
  169.  
  170. if (listA == null)
  171. {
  172. return null;
  173. }
  174. // Don't sort an empty list or a list with one node
  175. if (listA.size() <= 1)
  176. {
  177. return listA;
  178. }
  179.  
  180. // Split the list in half. If uneven then make left one larger.
  181. split(listA, listB);
  182.  
  183. return merge(mergeSort(listA), mergeSort(listB));
  184. }
  185.  
  186. /**
  187. * Reverses the order of a list
  188. *
  189. * @param list LinkedList to be reversed
  190. * @return List in reverse order
  191. */
  192. public LinkedList reverseList(LinkedList list)
  193. {
  194. System.out.println("reverseList");
  195.  
  196. return list;
  197.  
  198. }
  199.  
  200. /**
  201. * The main program for the MergeList class
  202. *
  203. * @param args The command line arguments (not used)
  204. */
  205. public static void main(String[] args)
  206. {
  207. MergeList mList = new MergeList("file20.txt");
  208. LinkedList list = new LinkedList();
  209.  
  210. System.out.println("Original list\n");
  211. mList.readData(list);
  212. mList.printList(list);
  213.  
  214. System.out.println("List after MergeSort\n");
  215. list = mList.mergeSort(list);
  216. mList.printList(list);
  217.  
  218. System.out.println("Reversed list\n");
  219. list = mList.reverseList(list);
  220. mList.printList(list);
  221. }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement