排序过程中的错误顺序首先按预定义顺序排序,然后使用 Comparator 方法 thenComparing() 按自然顺序排序

Wrong order during sorting at first by predefined order, and then by natural order using Comparator method thenComparing()

我有一个简单的对象class:

public class Employee {
    String name;
    String secondName;
 // Conctructor, getters & setters
}

员工名单:

        List<Employee> employees = new ArrayList<>(Arrays.asList(
                new Employee("Jake",  "Bbb"),
                new Employee("Ann",   "Aaa"),
                new Employee("Ivy",   "Bbb"),
                new Employee("Ivy",   "Aaa"),
                new Employee("Jake",  "Aaa"),
                new Employee("Tom",   "Iii"),
                new Employee("Neil",  "Xxx"),
                new Employee("Keith", "Ooo"),
                new Employee("Tom",   "Rrr")
        ));

我想先按照 secondNames 的预定义顺序对它们进行排序,而不是按照名称的自然顺序进行排序:

List<String> definedOrder = Arrays.asList("Iii", "Bbb", "Aaa");

这样:

employees.sort(
        Comparator.comparing((Employee e) -> definedOrder.indexOf(e.getSecondName()))
                .thenComparing(Employee::getName));

for (Employee em : employees){
     System.out.println(em.getSecondName() + " / " + em.getName());
}

而且我希望先接收列表中的预定义对象,然后再接收其余对象:

Iii / Tom
Bbb / Ivy
Bbb / Jake
Aaa / Ann
Aaa / Ivy
Aaa / Jake
Ooo / Keith
Xxx / Neil
Rrr / Tom

但我收到的对象首先按 names 的自然顺序排序(使用 thenComparing() 方法),然后按 secondName[ 的预定义比较=30=]s:

Ooo / Keith
Xxx / Neil
Rrr / Tom
Iii / Tom
Bbb / Ivy
Bbb / Jake
Aaa / Ann
Aaa / Ivy
Aaa / Jake

当在 definedOrder.

中找不到第二个名字时,您错过了 definedOrder.indexOf(e.getSecondName()) returns -1

这就是为什么 OooXxxRrr 出现在 IiiBbbAaa 之前的原因。

并且,由于 OooXxxRrr 出于 comparing 的目的都共享相同的值 (-1),它们被排序通过 thenComparing(Employee::getName)) 他们之间。


要修复此行为,您可以检查是否 definedOrder.indexOf(e.getSecondName()) returns -1,如果是,则改为 return Integer.MAX_VALUE