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
DogTeam is given in the solutions
directory, except for the
methods you will need to add. We have added a new
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
merge in the
DogTeam class, which takes
DogTeam objects as parameters and returns a single
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
iterator method for the
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
remove method of the
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
(which you must also write), which puts its input into the correct place in a
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
compareTo, and four missing methods in the
DogTeam class, namely
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