我有一個演員串列,其中每個演員都有一個型別(“藝術家”、“制片人”、“混音器”……其他一些型別)。
我需要考慮以下因素來訂購此串列:
- 將首先顯示“藝術家”型別的演員。
- 接下來將顯示具有“制片人”型別的演員。
- 接下來將顯示具有“混音器”型別的演員。
所有演員也必須根據他們的名字按字母順序排列。
我知道我可以撰寫不同的比較器并將它們鏈接起來,但我不確定如何實作前 3 點。
uj5u.com熱心網友回復:
最干凈的解決方案是使用型別的列舉,它擁有每種型別的優先級。基本上將型別映射到優先級編號。
public enum ActorType {
ARTIST(1),
PRODUCER(2),
MIXER(3);
private final int priority;
ActorType(int priority) {
this.priority = priority;
}
public static int compare(ActorType t1, ActorType t2) {
return Integer.compare(t1.priority, t2.priority);
}
}
那么比較器就很簡單了。
public class ActorByActorTypeComparator implements Comparator<Actor> {
@Override
public int compare(Actor actor1, Actor actor2) {
return ActorType.compare(actor1.getActorType(), actor2.getActorType());
}
}
如果您將 String 用于型別并且由于某種原因無法更改,則一個選項是比較器來保持每種型別的優先級。像這樣的東西。
public class ActorByTypeComparator implements Comparator<Actor> {
private final Map<String, Integer> typePriorityMap = new HashMap<>();
//add each type in map
//map.put("Artist", 1);
//or provide the map from constructor
@Override
public int compare(Actor a1, Actor a2) {
int a1Priority = this.typePriorityMap.getOrDefault(a1.getType(), Integer.MAX_VALUE);
//handle unknown type, according to your needs
int a2Priority = this.typePriorityMap.getOrDefault(a2.getType(), Integer.MAX_VALUE);
return Integer.compare(a1Priority, a2Priority);
}
}
第一個選項更簡潔且不易出錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/527491.html
標籤:爪哇
上一篇:如何在具有分組的串列中設定屬性