22 Comparisons
22 Comparisons
3
Constructor for Student
• This is the same for both methods—nothing new
here
• public Student(String name, int score) {
this.name = name;
this.score = score;
}
• We will be sorting students according to their
score
• This example will use sets, but that’s irrelevant—
comparisons happen between two objects,
whatever kind of collection they are or are not in
4
The main method, version 1
public static void main(String args[]) {
TreeSet set = new TreeSet();
6
Implementing Comparable
• public class Student implements Comparable
• This means it must implement the method
public int compareTo(Object o)
• Notice that the parameter is an Object
• In order to implement this interface, our parameter must also
be an Object, even if that’s not what we want
• public int compareTo(Object o) throws ClassCastException {
if (o instanceof Student)
return score - ((Student)o).score;
else
throw new ClassCastException("Not a Student!");
}
• A ClassCastException should be thrown if we are given a non-
Student parameter
7
An improved method *
8
*Suggested by Randall Sidlinger
Using a separate Comparator
• In the program we just finished, Student implemented
Comparable
– Therefore, it had a compareTo method
– We could sort students only by their score
• Now we will put the comparison method in a separate class
• This is more flexible (you can use a different Comparator to
sort Students by nameor by score), but it’s also clumsier
• This new class will implement Comparator instead of
Comparable
• Comparable requires a definition of compareTo but
Comparator requires a definition of compare
• Comparator also (sort of) requires equals
9
Outline of StudentComparator
import java.util.*;
10
The compare method
public int compare(Object o1, Object o2) {
return ((Student)o1).score - ((Student)o2).score;
}
11
The equals method
• This method is not used to compare two Students—
it is used to compare two Comparators
• Even though it’s part of the Comparator interface,
you don’t actually need to override it, since you
inherit equals from Object anyway
• In fact, it’s always safe to ignore it
• The purpose is efficiency—you can replace one
Comparator with an equal but faster one
• My opinion: ignore this method entirely!
12
The main method
• The main method is just like before, except that
instead of
We have
13
When to use each
• The Comparable interface is simpler and less work
– Say your class implements Comparable
– Provide a public int compareTo(Object o) method
– Use no argument in your TreeSet or TreeMap constructor
– You will use the same comparison method every time
• The Comparator interface is more flexible and more
work
– Create as many different classes that implement Comparator
as you like
– You can sort the TreeSet or TreeMap differently with each
– For example, sort Students by score or by name
14
Sorting differently
• Suppose you have students sorted by score, in a
TreeSet you call studentsByScore
• Now you want to sort them again, this time by name
Comparator myStudentNameComparator =
new MyStudentNameComparator();
TreeSet studentsByName =
new TreeSet(myStudentNameComparator);
studentsByName.addAll(studentsByScore);
15
The End
16