当前位置: 首页 > 知识库问答 >
问题:

用Lambda表达式排序多属性

仉宸
2023-03-14

这是我的清单:

Name: Ben     || Age: 5 || Group: 1
Name: Andy    || Age: 6 || Group: 2
Name: Charlie || Age: 6 || Group: 2
Name: Ben     || Age: 5 || Group: 1
Name: Andy    || Age: 5 || Group: 2
Name: Charlie || Age: 5 || Group: 1

我想按Group对列表进行排序,如果Group相等,则按age排序,如果age相等,则按Name排序。但是到目前为止,我只能使用Lambda表达式按一个属性排序:

list.sort((Object o1, Object o2) -> o1.getGroup().compareTo(o2.getGroup()));

如果我尝试

o1.getGroup().compareTo(o2.getGroup()) && o1.getAge().compareTo(o2.getAge())

事实证明是错误的。。。

共有2个答案

岳高明
2023-03-14

您可以使用静态方法比较器。比较基于返回可比较值的函数创建比较器。这样一个比较器可以与其他比较器连接起来。

假设你的类型是Person,你会:

Comparator<Person> c = Comparator
        .comparing(p -> p.getGroup())
        .thenComparing(p -> p.getAge())
        .thenComparing(p -> p.getName())

如果任何一个getter返回一个基元类型,则必须分别使用--comparingitthencaringit。也可以使用方法引用:

Comparator<Person> c = Comparator
        .comparing(Person::getGroup)
        .thenComparing(Person::getAge)
        .thenComparing(Person::getName)

但是如果您的类根据这些值具有自然排序,那么最好让它实现接口Comparable,并在其中编写比较逻辑:

class Person implements Comparable<Person> {
    ...
    @Override
    public int compareTo(Person other) {
        int compare = Integer.compare(getGroup(), other.getGroup());
        if (compare == 0) {
            compare = Integer.compare(getAge(), other.getAge());
        }
        if (compare == 0) {
            compare = getName.compareTo(other.getName());
        }
        return compare;
    }
}

这个代码片段也可以用在lambda表达式中:

list.sort((o1, o2) -> {
    int compare = Integer.compare(o1.getGroup(), o2.getGroup());
    if (compare == 0) {
        compare = Integer.compare(o1.getAge(), o2.getAge());
    }
    if (compare == 0) {
        compare = o1.getName.compareTo(o2.getName());
    }
    return compare;
});
施慈
2023-03-14

将lambda表达式更改为lambda{block},并且不必指定参数类型:

list.sort((o1, o2) -> {
    int cmp = o1.getGroup().compareTo(o2.getGroup());
    if (cmp == 0)
        cmp = Integer.compare(o1.getAge(), o2.getAge());
    if (cmp == 0)
        cmp = o1.getName().compareTo(o2.getName());
    return cmp;
});
 类似资料:
  • 问题内容: 这是我的清单: 我想按列表排序,如果等于则按,如果等于则按。但是到目前为止,我只能使用Lambda表达式按一个属性排序: 如果我尝试 原来是错误的… 问题答案: 将lambda 表达式 更改为lambda {block} ,而不必指定参数类型:

  • 让我们考虑一个类,它只包含一个属性。我创建了6个父类对象,属性值为。 在这两种情况下,我都得到一个。 这个怎么处理?

  • 你好我想对新创建的LinkedList进行升序排序,列表中的所有元素都是随机装箱的。我的任务是用比较器对它们进行排序,但我不允许编写实现比较器的类,而是应该用lambda表达式对其进行排序。这是我目前的代码: 到目前为止,我尝试使用集合和列表中的排序方法,但无法进一步帮助我。非常感谢您提前帮助我。

  • (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂

  • Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。 语法 (Syntax) lambda表达式的特征在于以下语法。 parameter -> expression body 以下是lambda表达式的重要特征。 Optional type declaration - 无需声明参数类型。 编译器可以从参数的值推断出相同的

  • 问题内容: 编辑: 直到这里,我得到适当的4行,但它们都是相同的结果(我知道我需要4行,但是有不同的结果) 我的问题是,如何仅通过LotteryOfferId来通过多对多表检索所有彩票? 我要实现的是通过LotteryDrawDateId从彩票表中获取数据。 首先,我使用LotteryOfferId从中间表获取DrawDates,然后通过中间表获取drawDateIds以在LotteryDrawD