如何在Java中创建比较优先级列表的比较器?

时间:2017-09-28 17:32:30

标签: java java-8 comparator

在我的场景中,我想比较一个字符串列表,BA之前,AC之前,优先级列表可能是{{} 1}}

我想知道是否有任何方便的方法来创建具有此类优先级列表的比较器?我还没有找到任何在线。

3 个答案:

答案 0 :(得分:3)

如果您乐意使用外部库,那么Guava的Ordering.explicit通常允许您按所需顺序提供值列表,并从中创建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();
}

如果你想将字符串 字典与这个订单进行比较......这有点困难,你可能不得不更明确地写它。

{{1}}

答案 1 :(得分:3)

您可以将所需的订单存储在简单的String中,然后使用此String中的字符索引对某些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]
}

答案 2 :(得分:1)

来自@Louis的答案相当不错,但如果不知何故你需要一个解决方案&lt; java8 如果没有番石榴,那么考虑使用collators

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]