如何在保留插入顺序的前提下按枚举值对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.
相关产品推荐
相关产品推荐

