首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个字段对对象列表进行排序(Java 8)

使用多个字段对对象列表进行排序(Java 8)
EN

Stack Overflow用户
提问于 2022-11-04 14:57:30
回答 1查看 42关注 0票数 0

假设我有一个类Person,它有方法getAge()getYearsOfEducation(),它们都返回ints,然后我有另一个类Employer,它有一个给定Person的方法getYearsOfEmployment(Person p),也返回一个int

代码语言:javascript
复制
Employer e = new Employer();
Person p1 = new Person(26, 3) // age and years of education
Person p2 = new Person(30, 4) 
Person p3 = new Person(28, 5) // let's say that e.getYearsOfEmployment(p3) returns 10
Person p4 = new Person(28, 5) // let's say that e.getYearsOfEmployment(p4) returns 8

当我有一个Person的列表(随机添加到列表中)时,我希望它按年龄、(2)按教育程度、(3)按就业年限(总是最不首先)排序--所以在上面的示例中,最后的顺序应该是p1p4p3p2。我很清楚如何按年龄和教育年限进行分类,但我不知道如何按就业年限进行最后排序,因为这不是Person的一种方法。

代码语言:javascript
复制
List<Person> persons = Arrays.asList(new Person[]{p1, p2, p3, p4});    
Collections.sort(persons, Comparator.comparing(Person::getAge)
        .thenComparing(Person::getYearsOfEducation)
        .thenComparing(...));

我想做什么是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-04 15:25:16

作为在评论中说,您需要对Employer实例的引用。

如果所有Person实例都属于同一个Employer,那么您可以在thenComparing()的keyExtractor函数中使用它(或者可以使用thenComparingInt()):

代码语言:javascript
复制
List<Person> persons = Arrays.asList(new Person[]{p1, p2, p3, p4});
Employer employer = // initializing the employer

Collections.sort(persons, Comparator.comparing(Person::getAge)
    .thenComparing(Person::getYearsOfEducation)
    .thenComparing(employer::getYearsOfEmployment);

其中,employer::getYearsOfEmployment相当于以下lambda表达式:

代码语言:javascript
复制
person -> employer.getYearsOfEmployment(person)

它应该被限定为对特定对象的实例方法的引用

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74318979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档