首页 > 解决方案 > 按特定字符排序的列表(Java 8)

问题描述

我有以下列表:

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

我需要在这个条件下订购它:

  1. 首先,包含字符“o”或“O”的那些
  2. 然后,剩下的人。

结果应该是:

Orange, Watermelon, Apple, Banana, Peach

我怎样才能在 Java 8 中做到这一点?

标签: javalistsortingjava-8comparator

解决方案


您可以使用比较器链。

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 的字符串首先出现,我用 a 翻转它!

这打印

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

推荐阅读