我有一個簡單的物件類:
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
但是我收到的物件首先按name s按自然順序排序,(使用 thenComparing() 方法),然后通過secondName s從預定義的比較中收到:
Ooo / Keith
Xxx / Neil
Rrr / Tom
Iii / Tom
Bbb / Ivy
Bbb / Jake
Aaa / Ann
Aaa / Ivy
Aaa / Jake
uj5u.com熱心網友回復:
你缺少definedOrder.indexOf(e.getSecondName())的回報-1時沒有找到的第二個名字definedOrder。
這就是為什么Ooo,Xxx并且Rrr出現之前Iii,Bbb和Aaa。
并且,作為Ooo,Xxx并且出于 的目的Rrr共享相同的值 ( -1) comparing,它們之間按順序排序thenComparing(Employee::getName))。
要修復此行為,您可以檢查是否definedOrder.indexOf(e.getSecondName())回傳-1,如果是,則回傳Integer.MAX_VALUE。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/352650.html
