She*_*ari 5 java sorting collections list comparator
我有一个大约70个领域的Enum.
我希望其中10个以特定顺序显示,然后我希望其余部分使用比较器按字母顺序显示.我尝试了很多东西,但我无法让它发挥作用.
这是一个具有简化属性的枚举示例, 我希望首先显示Picard,Worf和William,然后按字母顺序显示其余部分
我不能使用任何第三个库.它必须是java核心.所以如果你想提供番石榴答案,或者apache commons的答案,除了java核心之外,请这样做.
public enum StarTrek {
JeanLucPicard("Picard"),
GeordiLaForge("Geordi"),
DiannaTroi("Dianna"),
Worf("Worf"),
WilliamRiker("William"),
Q("Q");
private String label;
StarTrek(String label) { this.label = label; }
@Override public String toString() { return label; }
}
List<StarTrek> specificOrder = Arrays.asList(StarTrek.JeanLucPicard, StarTrek.Worf, StarTrek.WilliamRiker);
Comparator<StarTrek> comp = new Comparator<StarTrek>() {
@Override
public int compare(StarTrek o1, StarTrek o2) {
//TODO: loop through the specific order, and display those first, then for the rest, go alphabetic
return 0;
}
};
List<StarTrek> all = Arrays.asList(StarTrek.values());
Collections.sort(all, comp);
Run Code Online (Sandbox Code Playgroud)
Dun*_*nes 19
为了按特定顺序显示,在枚举中放置其他数据是不好的设计.相反,将所有逻辑放在您的身上Comparator
,如下所示:
public class StarTrekSorter implements Comparator<StarTrek> {
private static final List<StarTrek> ORDERED_ENTRIES = Arrays.asList(
StarTrek.JeanLucPicard, StarTrek.Worf, StarTrek.WilliamRiker);
@Override
public int compare(StarTrek o1, StarTrek o2) {
if (ORDERED_ENTRIES.contains(o1) && ORDERED_ENTRIES.contains(o2)) {
// Both objects are in our ordered list. Compare them by
// their position in the list
return ORDERED_ENTRIES.indexOf(o1) - ORDERED_ENTRIES.indexOf(o2);
}
if (ORDERED_ENTRIES.contains(o1)) {
// o1 is in the ordered list, but o2 isn't. o1 is smaller (i.e. first)
return -1;
}
if (ORDERED_ENTRIES.contains(o2)) {
// o2 is in the ordered list, but o1 isn't. o2 is smaller (i.e. first)
return 1;
}
return o1.toString().compareTo(o2.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,你可以排序:
public static void main(String[] args) {
List<StarTrek> cast = Arrays.asList(StarTrek.values());
Collections.sort(cast, new StarTrekSorter());
for (StarTrek trek : cast) {
System.out.println(trek);
}
}
Run Code Online (Sandbox Code Playgroud)
打印
Picard
Worf
William
Dianna
Geordi
Q
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6293 次 |
最近记录: |