2 回答

TA貢獻1797條經驗 獲得超6個贊
假設這sortlist是一個列表SortCriteria,它是這樣的一個類:
class SortCritera {
private String key;
private String order;
public String getKey() {
return key;
}
public String getOrder() {
return order;
}
// constructors, setters...
}
您首先需要一個HashMap<String, Comparator<Employee>>為每個可能的鍵存儲所有相應的比較器:
HashMap<String, Comparator<Employee>> comparators = new HashMap<>();
comparators.put("name", Comparator.comparing(Employee::getName));
comparators.put("age", Comparator.comparing(Employee::getAge));
// ...
然后你可以循環sortlist并繼續調用thenComparing:
Comparator<Employee> comparator = comparators.get(sortlist.get(0).getKey());
if (sortlist.get(0).getOrder().equals("DESC")) {
comparator = comparator.reversed();
}
for(int i = 1 ; i < sortlist.size() ; i++) {
if (sortlist.get(i).getOrder().equals("DESC")) {
comparator = comparator.thenComparing(comparators.get(sortlist.get(i).getKey()).reversed());
} else {
comparator = comparator.thenComparing(comparators.get(sortlist.get(i).getKey()));
}
}
// now you can sort with "comparator".
正如 Holger 所建議的那樣,您也可以使用 Stream API 來執行此操作:
sortlist.stream().map(sc -> {
Comparator<Employee> c = comparators.get(sc.getKey());
return sc.getOrder().equals("DESC")? c.reversed(): c;
}).reduce(Comparator::thenComparing)
.ifPresent(x -> Collections.sort(originalList, x));

TA貢獻1817條經驗 獲得超14個贊
您可以創建一個方法,當傳遞排序鍵時,您可以提供適當的比較器:
public Comparator<Employee> getComparator(String sortKey) {
if("name".equals(sortKey)) {
return Comparator.comparing(Employee::getName);
} else if ("place".equals(sortKey) {
return Comparator.comparing(Employee::getPlace);
} else {
throw new IllegalArgumentException();
}
}
要稱它為:
Collections.sort(sourceList, getComparator(sortKey).reversed()
.thenComparing(Employee::getCount));
雖然您也可以自己編寫,但我發現最好委托“標準”部分并簡單地編寫與此不同的部分。
如果您發現自己有很多這樣的排序鍵,那么更合適的方法是使用映射:
private static final Map<String, Comparator<Employee>> COMPARE_MAP = new HashMap<>() {{
put.("name", Comparator.comparing(Employee::getName));
put.("place", Comparator.comparing(Employee::getPlace));
}});
public Comparator<Employee> getComparator(String sortKey) {
if(COMPARE_MAP.containsKey(sortKey)) {
return COMPARE_MAP.get(sortKey);
} else {
throw new IllegalArgumentException();
}
}
反射也是一種選擇,但我會謹慎使用反射,除非不這樣做變得不切實際。在這種情況下,您可以創建自己的注釋來確定類 Employee 的哪些字段可用于排序。
添加回答
舉報