I have a method which needs a Comparator for one of its parameters. I would like to pass a Comparator which does a normal comparison and a reverse comparator which does in reverse.
java.util.Collections provides a reverseOrder() this is good for the reverse comparison, but I could not find any normal Comparator.
The only solution what came into my mind is Collections.reverseOrder(Collections.reverseOrder()). but I don’t like it because the double method calling inside.
Of course I could write a NormalComparator like this:
public class NormalComparator<T extends Comparable> implements Comparator<T> {
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}
But I’m really surprised that Java doesn’t have a solution for this out of the box.
Most places where you can specify a
Comparatoralso have a version without using aComparatorat all in which case it uses the natural order (i.e. it expects all objects to implementComparableand usescompareTo).So the usualy solution to this is to not specify a
Comparatorat all. Do you have a specific case where only theComparatorapproach is supported?If you absolutely need it, the Google Collections (as well as Guava, which is a superset of the Google Collections) provides
Ordering.natural()which returns aOrderingobject that represent the natural order as defined by theComparableinterface.OrderingimplementsComparator, so you can simply use that.