簡體   English   中英

如何在Java中創建具有優先級列表進行比較的比較器?

[英]How to create comparator in Java that takes a priority list for comparing?

在我的場景中,我想比較String的列表,即BA之前, AC之前,優先級列表可能是[B, A, C, D, F ...]

我想知道是否有任何方便的方法來創建具有這種優先級列表的比較器? 我還沒有在網上找到任何東西。

如果您樂於使用外部庫,那么Guava的Ordering.explicit通常可以讓您按所需順序提供值列表,並從中進行Comparator

否則,如果您按順序列出了一小部分字符,則可能可以避免使用

Comparator<Character> cmp = Comparator.comparingInt("BACDF..."::indexOf);

如果您要按字典順序按順序比較字符串 ...會有點困難,您可能必須更明確地編寫它。

Comparator<String> cmp = (a, b) -> {
  for (int i = 0; i < a.length() && i < b.length(); i++) {
    if (a.charAt(i) != b.charAt(i)) {
      String ordering = "BACDF...";
      return ordering.indexOf(a.charAt(i)) - ordering.indexOf(b.charAt(i));
    }
  }
  return a.length() - b.length();
}

您可以將所需的順序存儲在一個簡單的String ,然后使用此String中的char的索引對某些list進行排序,如下所示:

public static void main(String argv[]) {
    String order = "BACDFE";
    List<String> myList = new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E", "F"));

    System.out.println(Arrays.toString(myList.toArray()));  //[A, B, C, D, E, F]

    myList.sort(Comparator.comparingInt(order::indexOf));

    System.out.println(Arrays.toString(myList.toArray()));  //[B, A, C, D, F, E]
}

從答案@Louis是相當不錯的,但如果不知為何,你需要一個解決方案<java8並沒有番石榴再考慮使用排序器

List<String> myList = new ArrayList<>();
myList.add("car");
myList.add("distro");
myList.add("bar");
myList.add("air");
myList.add("folk");
String simple = "< b< a< c< d";
RuleBasedCollator mySimple = new RuleBasedCollator(simple);
System.out.println(myList);
Collections.sort(myList, mySimple);
System.out.println(myList);

輸出看起來像

排序之前

[car, distro, bar, air, folk]

排序后

[bar, air, car, distro, folk]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM