我已经可以按描述长度排序了,但是如果两个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);
}

}

在这种情况下,我如何使用比较器?或者我应该把它换成别的东西?

推荐答案

如果需要先按描述长度排序,然后按描述(字母顺序)排序,则第一次比较可以,但还需要按描述添加第二次比较.

您可以使用方法thenComparing()堆叠第二次比较.它将仅对长度相同的图元执行第二次比较.此场景不需要实现自定义Comparator.

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

Java相关问答推荐

如何审查Java dtos中的自定义注释字段?

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

Java .类参数不通过构造函数传递

如何找到MongoDB文档并进行本地化?

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

Spring data JPA/Hibernate根据id获取一个列值

生成桥方法以解决具有相同擦除的冲突方法

通过Spring Security公开Spring Boot执行器端点

Java-动态绑定-问题-了解

我可以在MacOS上使用什么Java函数来在适当的设备上以适当的音量播放适当的alert 声音?

Java连接池无法正常工作

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

在处理2个映射表时,没有更多的数据可从套接字读取

如何处理两个几乎相同的XSD文件?

在java中使用不同的application.properties-jar而不使用Spring

嘲笑黄瓜中的对象

在权限列表中找不到我的应用程序

Cucumber中第二个网页的类对象未初始化

java中的网上购物车解析错误