Here is my class:
public static class __9_7_Person implements Comparator<__9_7_Person> {
private int height;
private int weight;
public __9_7_Person(int height, int weight) {
this.height = height;
this.weight = weight;
}
public int compare(__9_7_Person p1, __9_7_Person p2) {
if (p1.height != p2.height) {
return p1.height - p2.height;
}
else {
return p1.weight - p2.weight;
}
}
}
I then created an array like this:
__9_7_Person p[] = {new __9_7_Person(60, 100),
new __9_7_Person(70, 150),
new __9_7_Person(56, 90),
new __9_7_Person(75, 190),
new __9_7_Person(60, 95),
new __9_7_Person(68, 110),
};
But got exception when I called Arrays.sort(p): “Exception in thread “main” java.lang.ClassCastException: ch_9$__9_7_Person cannot be cast to java.lang.Comparable”
You should implement
Comparablefor a natural ordering, in which case you don’t need to pass a separator comparator intoArrays.sort. Or you could implementComparator<__9_7_Person>(probably in a separate class, e.g.HeightWeightPersonComparator) and call:It’s important to understand the difference between
ComparableandComparator. AComparableimplementation says “I know how to compare myself to another object of an appropriate type” – where aComparatorimplementation says “I know how to compare two objects of appropriate types”.Obviously any type can only implement
Comparableonce (within reason), whereas there can be any number ofComparatorimplementations. Using a separateComparatoris more flexible unless there’s an “obvious” comparison you should use. If you don’t specify aComparator,Arrays.sortwill assume that each of the elements in the array can compare itself with other elements of the array, i.e. they implementComparable.