让我们说我想对列表进行两次排序,每次使用不同的比较器,第一个比较器优先于第二个比较器。可以简单地调用SortedList构造函数两次,每个比较器调用一次吗?
为了澄清我为什么要这样做,我们假设我有一个Student
个对象的无序列表,其中包含Age
和Name
字段。现在,我想要实现的最终结果是Student
列表,其中较年轻的学生将出现在列表的前面。但是,如果有一组年龄相同的学生,我希望它们按排序名称顺序出现。问题在于我只能使用给我的比较器 - 在这种情况下,根据指定的比较器,比较学生的年龄或名称。
对列表进行两次排序,首先按名称排序,然后按年龄a基数排序,解决问题,但前提是所涉及的排序算法是稳定的。我知道Collections.sort
是稳定的,但我不确定SortedList
是否会发挥相同的行为。
我喜欢J Atkin的thenComparing
答案,我认为这就是我要做的,但现在我只是好奇SortedList
是否稳定。
答案 0 :(得分:3)
是的,它很稳定。我刚检查了SortedList
的实现,发现了一个名为SortHelper
的类,它对SortedList
执行排序。其中有一个名为sort
的方法:
public <T> int[] sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) {
....
if (c==null)
mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
因此SortedList
使用merge sort,这是稳定的。
所有这一切都很好,但是,更简洁的方法是使用thenComparing
组合比较器:
sortAge.thenComparing(sortName))