Java中如何基于同类型参照列表按name属性排序Employee对象列表
实现方案
实现逻辑
- 先遍历
list2,把每个Employee的name属性和它在list2中的下标绑定,存成优先级映射表。匹配不到的name统一分配一个比所有有效下标都大的优先级值,保证这类元素排在已匹配元素之后。 - 基于这个优先级映射表对
list1做排序,排序时直接取每个元素name对应的优先级值比较大小即可。 - 未匹配到顺序的元素之间会保留原
list1中的相对顺序,符合常规排序预期。
完整代码
直接在原有示例代码基础上补充排序逻辑即可,完整可运行代码如下:
import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class SortEmployee { public static void main(String[] args) { List<Employee> list1 = Stream.of( new Employee("Zach","Boston","Massachusetts"), new Employee("Alex","Atlanta","Georgia"), new Employee("Jijo","pleasanton","California"), new Employee("Sai","Decatur","Texas"), new Employee("Yohan","Cumming","Atlanta"), new Employee("Agni","sula","Maine"), new Employee("Bajan","Duluth","Ohio")) .collect(Collectors.toList()); List<Employee> list2 = Stream.of( new Employee("Alex","Atlanta","Georgia"), new Employee("Sai","Decatur","Texas"), new Employee("Musa","Fremont","California"), new Employee("Zach","Boston","Massachusetts"), new Employee("Bajan","Duluth","Rhode Island"), new Employee("Khan","Kalan","Ohio"), new Employee("Jijo","pleasanton","California")) .collect(Collectors.toList()); // 构建name对应的排序优先级映射 Map<String, Integer> nameOrderMap = new HashMap<>(); for (int i = 0; i < list2.size(); i++) { // 重名场景只保留第一次出现的顺序,避免后续重复name覆盖优先级 nameOrderMap.putIfAbsent(list2.get(i).getName(), i); } int defaultPriority = list2.size(); // 执行排序 List<Employee> sortedList1 = list1.stream() .sorted(Comparator.comparingInt(emp -> nameOrderMap.getOrDefault(emp.getName(), defaultPriority))) .collect(Collectors.toList()); // 输出结果验证 System.out.println("##### 排序后 List-1 ####"); sortedList1.forEach(System.out::println); } }
对应的Employee类保留原有Lombok注解即可:
import lombok.Data; @Data public class Employee { String name; String city; String state; }
结果说明
运行代码后输出的排序结果和预期完全一致:
- Alex 排第一位(对应list2下标0)
- Sai 排第二位(对应list2下标1)
- Zach 排第三位(对应list2下标3)
- Bajan 排第四位(对应list2下标4)
- Jijo 排第五位(对应list2下标6)
- 未在list2中匹配到name的Yohan、Agni按原list1顺序排在最后
注:排序逻辑只匹配
name属性,不会校验city、state字段是否一致,完全符合题目要求。
内容的提问来源于stack exchange,提问作者Musa
相关产品推荐
相关产品推荐

