我有一個未排序的物件串列:
List<Object> unsortedList = {objB, objB, objC, objA, objD, objA, ...}
我的目標是根據多個條件獲得一個排序串列,如下所示:
List<Object> sortedList = {objA, objA, objB, objC, objD, ...}
我知道我可以使用幾種不同的方法,例如 Comparator:
Collections.sort(unsortedList, Comparator.comparing(Object::isAttributeA)
.thenComparing(Object::isAttributeB))
.thenComparing(Object::isAttributeC))...
但是,方法“isAttribute*”接受與手頭物件相關的引數/引數。
for 回圈形式(不太漂亮)中所需的邏輯如下所示:
for(Object obj : unsortedList){
if(obj.isAttributeA(obj)){
sortedList.add(obj);
}
}
for(Object obj : unsortedList){
if(obj.isAttributeB(obj.getField())){
sortedList.add(obj);
}
}
for(Object obj : unsortedList){
if(obj.isAttributeC(obj.getAnotherField())){
sortedList.add(obj);
}
}
是否有更好或更“優雅”的方法來遍歷物件串列并根據多個條件對其進行排序,并將滿足下一個條件的物件放在滿足前一個條件的物件之后?
編輯:目標是使用某些條件將未排序的串列劃分為子組,以便為??另一種方法分配優先級。換句話說,還有另一種方法將使用這種排序的物件串列對每個物件執行操作,這些操作必須按特定順序完成以避免進一步的問題。
uj5u.com熱心網友回復:
聽起來你想要的實際上是這樣的
private static <T> int firstSatisfying(List<Predicate<T>> predicates, T t) {
for (int i = 0; i < predicates.size(); i ) {
if (predicates.get(i).test(t)) {
return i;
}
}
return predicates.size();
}
static final List<Predicate<Foo>> predicates = Arrays.asList(
Foo::isAttributeA, Foo::isAttributeB, ...);
Collections.sort(
unsortedList,
Comparator.comparingInt(t -> firstSatisfying(predicates, t)));
...如果您想按第一個匹配條件對元素進行排序,請按條件的某種順序。這不是最有效的可能實作,但聽起來您只有幾個條件可以檢查成本低,在這種情況下這會很好。
uj5u.com熱心網友回復:
您可以撰寫一個不是方法參考的比較器。
List<YourObject> sortedList = unsortedList.stream()
.sorted(Comparator.comparing((YourObject obj) -> obj.isAttributeA(obj))
.thenComparing(obj -> obj.isAttributeB(obj.getField()))
.thenComparing(obj -> obj.isAttributeC(obj.getAnotherField())))
.toList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/348927.html
