按特定字符排列的订购清单(Java 8)

时间:2018-09-06 09:35:35

标签: java list sorting java-8 comparator

我有以下列表:

List<String> fruits = new ArrayList<String>(Arrays.asList("Apple", "Banana", "Orange", "Watermelon", "Peach")); 

我需要在这种情况下订购它:

  1. 首先是包含字符“ o”或“ O”的字符
  2. 然后,其余的。

结果应为:

Orange, Watermelon, Apple, Banana, Peach

如何在Java 8中做到这一点?

1 个答案:

答案 0 :(得分:12)

您可以使用比较器链。

List<String> fruits = new ArrayList<>(Arrays.asList(
                               "Apple", "Banana", "Orange", "Watermelon", "Peach"));
fruits.sort(Comparator.comparing((String s) -> !s.contains("O") && !s.contains("o"))
        .thenComparing(Comparator.naturalOrder()));
System.out.println(fruits.stream().collect(Collectors.joining(", ")));

第一个比较器查看字符串中是否包含一个O,使该字符首先出现,而第二个比较器使用自然顺序。

注意:Boolean.TRUE.compareTo(Boolean.FALSE) > 0要使包含O的字符串首先进入,我用!翻转它

此打印

Orange, Watermelon, Apple, Banana, Peach

注意:在这种情况下,不需要new ArrayList<>( ... ),因为sort不会更改元素的数量,只需重新排列即可。


编辑:基于@Holger的建议。

如果首选稳定的排序方式,即尽可能保留订单顺序。

List<String> fruits = Arrays.asList(
        "Watermelon", "Peach", "Orange", "Banana", "Apple");
fruits.sort(Comparator.comparing((String s) -> !s.contains("O") && !s.contains("o")));
System.out.println(fruits.stream().collect(Collectors.joining(", ")));

打印

Watermelon, Orange, Peach, Banana, Apple