The goal of this lab is to practice writing generic classes. In class we have seen examples of generic linked lists and a generic ArrayList-like class. In this lab we will write a generic class that will be something similar to a HashMap.
A map (also called a dictionary or associative array)
associates keys with values.
See the
Map
in Java's API as an example
of the functionality.
We will use a simplified version of this interface in the lab. Your main task in this lab is to implement this interface.
As usual, make a directory for this lab. Copy the following code from the public directory.
cp /homes/tvandrun/Public/cs245/lab8/* .
Open Eclipse and make a new project from the existing source in your directory.
Next, look at the driver program, SLMDriver.java
,
so that you see what the map will be used for.
Basically it will be used to tally the frequencies of words in
a file.
You may remember this example from Lab 4.
On the inside, your class will be a linked list. Think about how you would implement such a think as a linked list, consider how it would need to be different from the linked lists we've already seen, and how the specific operations would be defined.
This map, however, will have a special feature.
Java's HashMap
orders associations in an unpredictable order---
if you iterated through the key set, you would not get the keys in
the same order that you added them, nor would there be any clear
reason for the order that they would be iterated through.
Your map, however, will take a Comparator<K>
object
in its constructor---that is, a comparator with the same parameterized
type as the key type.
This will determine how the associations are ordered
and what order the keys come when using keyIterator()
.
Oh, and resist the temptation to refer to your class as a hash map. The "hash" in "hashmap" refers to a specific way to implement a map (or set). We are not doing hashing in this lab. But we will learn about hashing later in the semester.
Finally, before you move on discuss with your partner and decide the basic structure of your classes. How will you implement the map as a linked list? What will your node class look like? You may make your node class either as a stand-alone class or as a nested class.
SortedListMap
classNow, open SortedListMap
.
It is currently just a stub.
You can use Eclipse's feature to "add unimplemented methods"
(hover over the error icon to the left of the line with
the class declaration) to make stubs for the rest of the methods
in the Map
interface.
I recommend you write the part of this class in the following order:
SortedListMap
class.
SortedListMap
class
SortedListMap
constructor.
containsKey()
method.
get()
method.
keyIterator()
method (which should
return an anonymous inner class).
put()
method, which will in
some ways be the hard part, since you need to use the comparator
to put things in the right order.
remove()
method, which will also
have its own algorithmic difficulties.
When you are ready to test your SortedListMap
,
you'll also need to write a comparator.
In this case, we want the key/value associations stored
in alphabetical order of the keys.
You will write a comparator for strings that performs that
comparison.
(The comparison itself is very easy, because String
already has a compareTo()
method which
does exactly that comparison.)
However, instead of writing a plain old class that implements
Comparator
,
make this also to be an anonymous inner class.
Map<String, Integer> tally = null; //new SortedListMap<String, Integer>(...your comparator...);
to
Map<String, Integer> tally = new SortedListMap<String, Integer>(...your comparator...);
except write your anonymous inner class in place of "...your comparator...".