创建反转顺序的比较器的最佳方法

时间:2014-06-25 04:25:06

标签: java sorting reverse comparator

这可能看起来像一个愚蠢的问题,但我想查询以相反的顺序排序类别List的可排序结构(任何类型,可能是MyClass)的最佳方式没有实现Comparable

首先,由于MyClass未实现Comparable而我想对其进行排序,因此我创建了Comparator,如下所示:

public class MyClassComparator implements Comparator<MyClass> {
    @Override
    public int compare(MyClass o1, MyClass o2) {
        return (o1.getMyField()).compareTo(o2.getMyField());
    }
}

当然,这会根据MyClass.MyField的自然顺序对MyClass对象进行排序。但我想要相反的顺序。

我当然可以在compare(MyClass o1, MyClass o2)方法中对相反顺序进行硬编码。像

这样的东西
if (o1.getMyField()).compareTo(o2.getMyField()) > 0 return -1;
if (o1.getMyField()).compareTo(o2.getMyField()) < 0 return 1;
return 0;

Anoter替代方案是按照我最初建议的方式离开MyClassComparator的代码,并使用public static <T> Comparator<T> reverseOrder(Comparator<T> cmp)中的java.util.Collections传递MyClassComparator的实例并获得反向比较器。

第三种选择,我认为是错误的,可能是使用自然命令Comparator对LinkedList<MyClass>进行排序,并从最后到第一次获取元素。 LinkedList是一个双重链接列表,所以它应该完美地处理它。问题是我总是必须得到一个特定的Iterator而不是仅使用for each循环(次要),当然,我最初想要排序任何可排序的结构,我可以' t保证它将是一个双向链表或任何能够以相反顺序迭代它的东西。

考虑到我非常肯定(不能100%肯定)我不会使用MyClass对象的自然顺序,只是相反的顺序,什么是最好的方法获得我的反向比较器?

谢谢。

1 个答案:

答案 0 :(得分:1)

这里使用比较器是正确的方法,以避免反转数组的开销。如果要比较的类实现Comparable,则可以反转比较的顺序。 obj2.compareTo(obj1)。可视化的一种方法是将两个对象视为整数,并将它们作为减去它们。