Java Reference
In-Depth Information
The
Comparable
Interface
This subsection requires material on arrays from Chapter 6. If you have not yet cov-
ered Chapter 6, you can skip this section and the following Programming Example
without any loss of continuity. If you have read Chapter 6, you should not consider
this section to be optional.
In Chapter 6 (Display 6.11), we introduced a method for sorting a partially filled
array of base type
double
into increasing order. It is very easy to transform the code
into a method to sort into decreasing order instead of increasing order. (See Self-Test
Exercise 20 of Chapter 6 and its answer if this is not clear to you.) It is also easy to
modify the code to obtain methods for sorting integers instead of
double
s or sorting
strings into alphabetical order. Although these changes are easy, they seem to be, and
in fact are, a useless nuisance. All these sorting methods are essentially the same. The
only differences are the types of the values being sorted and the definition of the order-
ing. It would seem that we should be able to give a single sorting method that covers
all these cases. The
Comparable
interface lets us do this.
The
Comparable
interface is in the
java.lang
package and so is automatically avail-
able to your program. The
Comparable
interface has only the following method head-
ing that must be implemented for a class to implement the
Comparable
interface:
compareTo
public int
compareTo(Object other);
The
Comparable
interface has a semantics, and it is the programmer's responsibility
to follow this semantics when implementing the
Comparable
interface. The semantics
says that
compareTo
returns
a negative number if the calling object “comes before” the parameter
other
,
a zero if the calling object “equals” the parameter
other
,
and a positive number if the calling object “comes after” the parameter
other
.
1
Almost any reasonable notions of “comes before” should be acceptable. In partic-
ular, all of the standard less-than relations on numbers and lexicographic ordering
on strings are suitable ordering for
compareTo
. (The relationship “comes after” is just
the reverse of “comes before.”) If you need to consider other ordering, the precise
rule is that the ordering must be a total ordering, which means the following rules
must be satisfied:
(Irreflexive) For no object
o
does
o
come before
o
.
(Trichotomy) For any two objects
o1
and
o2
, one and only one of the following
holds true:
o1
comes before
o2
,
o1
comes after
o2
, or
o1
equals
o2
.
(Transitivity) If
o1
comes before
o2
and
o2
comes before
o3
, then
o1
comes before
o3
.
The “equals” of the
compareTo
method semantics should coincide with the
equals
methods if that is possible, but this is not absolutely required by the semantics.
1
Because the parameter to
CompareTo
is of type
Object
, an argument to
CompareTo
might not be an
object of the class being defined. If the parameter
other
is not of the same type as the class being
defined, then the semantics specifies that a
ClassCastException
should be thrown.