You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何基于同类型参照列表按name属性排序Employee对象列表

实现方案

实现逻辑

  1. 先遍历list2,把每个Employee的name属性和它在list2中的下标绑定,存成优先级映射表。匹配不到的name统一分配一个比所有有效下标都大的优先级值,保证这类元素排在已匹配元素之后。
  2. 基于这个优先级映射表对list1做排序,排序时直接取每个元素name对应的优先级值比较大小即可。
  3. 未匹配到顺序的元素之间会保留原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 11:30:44