Posted 3 November 2011 due at 11:59 p.m. EDT on Sunday 13 November 2011, by placing .java files and .class files in your cs187 directory on your edlab account. Please place files for this assignment in a subdirectory of cs187 called "project6".
As we get questions on this assignment we will put answers on the Q&A page.
Some useful code is available in this directory on the course web site. We will make a sample driver available within a few days.
Goals of this project:
As on Practice Midterm #2, the managers of the Iditarod sled dog race
have asked you for help with a data processing job. They have an array
containing the team rosters for each dog team entering the race, each
stored as a DogTeam object. (The code for the classes
Dog, SledDog, and DogTeam is given in the solutions
directory, except for the
methods you will need to add. We have added a new int field
named teamNumber to the SledDog class.) They would like a single list of all the dogs
competing in the race, in a single DogTeam object that is
sorted -- in alphabetical order by name, such that multiple dogs
with the same name are in order by team number. (The rules forbid two dogs
with the same name being on the same team.)
You should implement the Mergesort algorithm from Chapter 8 of L&C,
though you cannot use the code there directly since it sorts arrays of
comparable elements, not linked lists. Your main tool will be a static
method merge in the DogTeam class, which takes
two sorted DogTeam objects as parameters and returns a single
sorted DogTeam object containing exactly those dogs that are in
either input team.
But you also need to create sorted teams from your input unsorted teams,
without having side effects on those teams. You are to do this by
creating an iterator method for the DogTeam class,
such that this method returns an Iterator<SledDog> object for the calling
dog team. (Since Iterator<SledDog> is an interface rather than a class,
you will have to create an object of some suitable class that implements
that interface -- you may find a library class or a class in L&C that will do,
or you may write your own.) (Note that your iterator need not implement
the optional remove method of the Iterator
interface.) Once you have this iterator, create a sorted
version of each input team by using the iterator to get each member, then
adding that member to a new team using the method addInPlace
(which you must also write), which puts its input into the correct place in a
sorted DogTeam object.
One of the existing DogTeam methods throws an
EmptyCollectionException, so code for this L&C exception class
is included. There is also a method in DogTeam to check whether
the calling team is sorted according to the compareTo method in
SledDog (which you must also write).
You will need to write one missing method in the SledDog
class, namely compareTo, and four missing methods in the
DogTeam class, namely addInPlace, iterator
, merge, and mergeSortTeams. You may also
wind up writing your own iterator class.
When you mergesort the teams into one, you should merge them in pairs, then merge the resulting teams in pairs, and so forth until you have one team. If you merge the first two teams, then merge the result with the third team, then the result of that with the fourth team, and so forth, this may be much slower than doing them in pairs like a binary tournament. Here is a hint how to do this. If you have an array of n teams, you could merge 0 with n-1 and put the result in 0, then merge 1 with n-2 and put the result in 1, and so on until you have n/2 or n/2 + 1 teams left. Then you can repeat the process to group the new teams into pairs and merge them so you have about n/4 teams left, and continue through about n/8, n/16, and so on until there is one team.
You may borrow code from any of L&C's classes, or from our solutions, with specific attribution in a comment.
Last modified 6 November 2011