排序过程中的错误顺序首先按预定义顺序排序,然后使用 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
这就是为什么 Ooo
、Xxx
和 Rrr
出现在 Iii
、Bbb
和 Aaa
之前的原因。
并且,由于 Ooo
、Xxx
和 Rrr
出于 comparing
的目的都共享相同的值 (-1
),它们被排序通过 thenComparing(Employee::getName))
他们之间。
要修复此行为,您可以检查是否 definedOrder.indexOf(e.getSecondName())
returns -1
,如果是,则改为 return Integer.MAX_VALUE
。
我有一个简单的对象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
这就是为什么 Ooo
、Xxx
和 Rrr
出现在 Iii
、Bbb
和 Aaa
之前的原因。
并且,由于 Ooo
、Xxx
和 Rrr
出于 comparing
的目的都共享相同的值 (-1
),它们被排序通过 thenComparing(Employee::getName))
他们之间。
要修复此行为,您可以检查是否 definedOrder.indexOf(e.getSecondName())
returns -1
,如果是,则改为 return Integer.MAX_VALUE
。