Java 首先按长度然后按字母顺序对流列表进行排序

Java sort list with streams first by length then alphabetically

我已经可以按描述长度排序,但是如果两个 Article 的长度相同,我如何按字母顺序对其进行排序? (如果两篇文章的描述长度相同,则按字母顺序排序)。

   public List<Article> sortAsc() {
    removeNull();
    return articles.stream()
            .sorted(Comparator.comparingInt(a -> a.getDescription().length()))
            .collect(Collectors.toList());
}




public class ComparatorAppController implements Comparator<String> {

/***
 * compare each element
 * @param o1
 * @param o2
 * @return
 */
public int compare(String o1, String o2) {
    // check length in one direction
    if (o1.length() > o2.length()) {
        return 1;
    }
    // check length in the other direction
    else if (o1.length() < o2.length()) {
        return -1;
    }
    // if same alphabetical order
    return o1.compareTo(o2);
}

}

在这种情况下如何使用我的比较器?还是我应该将其更改为其他内容?

您的自定义比较器看起来不错。但是,在 streamssorted 方法中,您使用了另一个比较器。

考虑到自定义比较器与以下代码块在同一 class 中,这就是您可以插入自定义比较器的方法。

  return articles.stream()
            .sorted(this::compare)
            .collect(Collectors.toList());

使用Comparator.comparing(KeyExtractor,Comparator)

public List<Article> sortAsc() {
    removeNull();
    return articles.stream()
            .sorted(Comparator.comparing(a -> a.getDescription(), new ComparatorAppController()))
            .collect(Collectors.toList());
}

或者用一些 thenComparing*

定义所有标准
public static List<Article> sortAsc() {
    return articles.stream()
            .sorted(Comparator.<Article>comparingInt(a -> a.getDescription().length())
                    .thenComparing(Article::getDescription))
            .collect(Collectors.toList());
}

如果您需要先按描述长度排序,然后再按描述(字母顺序)排序,那么您的第一次比较没问题,但您还需要按描述添加第二次比较。

您可以使用方法 thenComparing() 堆叠第二次比较。它只会对相同长度的元素进行第二次比较。无需为此方案实施自定义 Comparator

public List<Article> sortAsc() {
    removeNull();
    return articles.stream()
            .sorted(Comparator.comparingInt((Article a) -> a.getDescription().length())
                .thenComparing(Article::getDescription))
            .collect(Collectors.toList());
}

为什么你需要在 stream 中排序,你可以简单地为你的列表调用 'sort' 方法。

articles.sort(new ComparatorAppController()); 

sort方法中可以添加n个比较器。 例如:-

articles.sort(new ComparatorAppController().thenComparing(new SomeOtherComparing())); 

您也可以在 stream 中使用 thenComparing

articles.stream()
            .sorted(Comparator.comparingInt(a -> a.getDescription().length()).thenComparing(new SomeOtherComparing()))
            .collect(Collectors.toList());

删除您的比较器并使用 comparing()thenComparing() 构建一个:

articles.stream()
  .sorted(Comparator.comparing(a -> a.getDescription().length())
                    .thenComparing(Article::getDescription))
        .collect(Collectors.toList());