Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Direct comparator in Java out of the box

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.

like image 955
KARASZI István Avatar asked Jun 02 '10 10:06

KARASZI István


2 Answers

Most places where you can specify a Comparator also have a version without using a Comparator at all in which case it uses the natural order (i.e. it expects all objects to implement Comparable and uses compareTo).

So the usualy solution to this is to not specify a Comparator at all. Do you have a specific case where only the Comparator approach 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 a Ordering object that represent the natural order as defined by the Comparable interface. Ordering implements Comparator, so you can simply use that.

like image 197
Joachim Sauer Avatar answered Sep 22 '22 23:09

Joachim Sauer


But I'm really surprised that Java doesn't have a solution for this out of the box.

I suppose it would be useful in a few cases ... like yours. But in most use-cases an application would simply use the object's compareTo method directly. Indirecting via an Comparator object would serve no purpose ... most of the time.

My guess is that the designers of those Java APIs did not consider your use-case important enough to support directly. Besides, your implementation is only four lines of code.

The Java class libraries are not perfect. Learn to live with it :-).

like image 43
Stephen C Avatar answered Sep 24 '22 23:09

Stephen C