排序:如何创建特定的自定义顺序,然后在java中进行字母排序

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)

  • +1我喜欢这个答案.你对设计问题是正确的. (4认同)