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

如何在保留插入顺序的前提下按枚举值对LinkedList排序?

没问题,我来帮你搞定这个需求!咱们一步步拆解来做:

步骤1:补全Person类的核心方法

首先你的Person类里getSeverity方法还没完成,这是后续排序的基础——只有能获取到每个Person的枚举字段,才能基于它排序。另外建议补上name的getter,方便后续验证结果:

class Person {
    private Level severity;
    private String name;
    public Person(Level severity, String name) {
        super();
        this.severity = severity;
        this.name = name;
    }
    public Level getSeverity() {
        return this.severity;
    }
    // 可选:补上name的getter,方便调试输出
    public String getName() {
        return this.name;
    }
}
步骤2:实现按枚举值排序LinkedList

枚举Level本身已经实现了Comparable接口,它的自然顺序就是你定义的顺序:HIGH > MEDIUM > LOW,我们可以直接利用这个特性来排序,同时还能满足「相同枚举值的元素保留原插入顺序」的需求(因为Java的排序是稳定排序)。

方案A:直接修改原LinkedList排序

如果可以接受调整原列表的顺序,直接用Java 8+支持的List.sort()方法即可:

public static void main(String[] args) {
    // 初始化带有插入顺序的LinkedList
    List<Person> personList = new LinkedList<>();
    personList.add(new Person(Level.MEDIUM, "Alice"));
    personList.add(new Person(Level.LOW, "Bob"));
    personList.add(new Person(Level.HIGH, "Charlie"));
    personList.add(new Person(Level.MEDIUM, "David"));

    // 按枚举Level的自然顺序排序
    personList.sort(Comparator.comparing(Person::getSeverity));

    // 验证排序结果
    for (Person p : personList) {
        System.out.println(p.getName() + ": " + p.getSeverity());
    }
}

执行后输出:

Charlie: HIGH
Alice: MEDIUM
David: MEDIUM
Bob: LOW

可以看到,两个MEDIUM的Person(Alice和David)保留了原来的插入顺序,完全符合需求。

方案B:创建副本排序,保留原列表插入顺序

如果你不想改动原LinkedList的插入顺序,而是生成一个独立的排序后列表,可以先复制原列表再排序:

public static void main(String[] args) {
    List<Person> originalList = new LinkedList<>();
    originalList.add(new Person(Level.MEDIUM, "Alice"));
    originalList.add(new Person(Level.LOW, "Bob"));
    originalList.add(new Person(Level.HIGH, "Charlie"));
    originalList.add(new Person(Level.MEDIUM, "David"));

    // 创建原列表的副本,避免修改原数据
    List<Person> sortedList = new LinkedList<>(originalList);
    // 对副本排序
    sortedList.sort(Comparator.comparing(Person::getSeverity));

    // 原列表顺序完全保留
    System.out.println("原列表顺序:");
    for (Person p : originalList) {
        System.out.println(p.getName() + ": " + p.getSeverity());
    }

    // 排序后的列表
    System.out.println("\n排序后的列表:");
    for (Person p : sortedList) {
        System.out.println(p.getName() + ": " + p.getSeverity());
    }
}
额外扩展:自定义枚举排序顺序

如果你不想用枚举定义的自然顺序,比如想改成LOW > MEDIUM > HIGH,可以手动实现Comparator逻辑:

// 反转枚举自然顺序,实现LOW优先
personList.sort(Comparator.comparing(Person::getSeverity).reversed());

// 或者完全自定义排序逻辑
personList.sort((p1, p2) -> {
    // 比如让MEDIUM排第一,然后HIGH,最后LOW
    if (p1.getSeverity() == Level.MEDIUM) return -1;
    if (p2.getSeverity() == Level.MEDIUM) return 1;
    return p1.getSeverity().compareTo(p2.getSeverity());
});

内容的提问来源于stack exchange,提问作者Junaid S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:25:43