这可能看起来像一个愚蠢的问题,但我想查询以相反的顺序排序类别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
对象的自然顺序,只是相反的顺序,什么是最好的方法获得我的反向比较器?
谢谢。
答案 0 :(得分:1)
这里使用比较器是正确的方法,以避免反转数组的开销。如果要比较的类实现Comparable,则可以反转比较的顺序。 obj2.compareTo(obj1)
。可视化的一种方法是将两个对象视为整数,并将它们作为减去它们。