如何在 Java 中按 ID 对自定义类列表进行升序/降序排序

本文详解如何通过实现 comparable 接口,使 complaint 类支持自然排序,并使用 collections.sort() 对 list 按 id 字段高效完成升序与降序排序。

在 Java 中对自定义对象列表(如 List)进行排序,核心在于明确“如何比较两个对象”。最常用且推荐的方式是让类实现 Comparable 接口,并重写 compareTo() 方法,从而定义其自然排序规则。以题目中的 Complaint 类为例,我们希望按 id(整型)升序排列,以下是完整、现代、可直接运行的实践方案:

✅ 步骤一:实现 Comparable 并定义 id 比较逻辑

public class Complaint implements Comparable 

{ private int id; private String state; public Complaint(int id, String state) { this.id = id; this.state = state; } public int getId() { return id; } public String getState() { return state; } @Override public int compareTo(Complaint other) { // 直接委托 Integer.compare() —— 安全、简洁、避免溢出 return Integer.compare(this.id, other.id); } @Override public String toString() { return "Complaint{id=" + id + ", state='" + state + "'}"; } }
? 关键提示:优先使用 Integer.compare(a, b) 而非手动 if-else 或 a - b(后者可能因整数溢出导致错误结果)。该方法返回负数、零或正数,完全符合 Comparable 合约。

✅ 步骤二:使用 Collections.sort() 进行排序

import java.util.*;

public class SortExample {
    public static void main(String[] args) {
        List complaints = new ArrayList<>();
        complaints.add(new Complaint(1, "inregistrata"));
        complaints.add(new Complaint(3, "solutionata"));
        complaints.add(new Complaint(2, "solutionata"));

        System.out.println("原始列表: " + complaints);
        // 升序排序(自然顺序)
        Collections.sort(complaints);
        System.out.println("升序后: " + complaints);

        // 降序排序:可反转升序结果,或使用 Comparator.reverseOrder()
        Collections.reverse(complaints);
        System.out.println("降序后: " + complaints);

        // ✅ 更优雅的降序写法(无需修改原列表顺序):
        // complaints.sort(Comparator.reverseOrder());
    }
}

输出示例

原始列表: [Complaint{id=1, state='inregistrata'}, Complaint{id=3, state='solutionata'}, Complaint{id=2, state='solutionata'}]
升序后: [Complaint{id=1, state='inregistrata'}, Complaint{id=2, state='solutionata'}, Complaint{id=3, state='solutionata'}]
降序后: [Complaint{id=3, state='solutionata'}, Complaint{id=2, state='solutionata'}, Complaint{id=1, state='inregistrata'}]

⚠️ 注意事项与进阶建议

  • 空值安全:若 id 可能为 null(如包装类型 Integer),需先判空,改用 Objects.compare(this.id, other.id, Integer::compareTo)。
  • 多字段排序:若需先按 id、再按 state 排序,可链式调用:
    return Integer.compare(this.id, other.id) != 0 ? Integer.compare(this.id, other.id) : this.state.compareTo(other.state);
  • 不修改原类?用 Comparator:若无法修改 Complaint 源码,可外部定义 Comparator:
    complaints.sort(Comparator.comparingInt(Complaint::getId));
    complaints.sort(Comparator.comparingInt(Complaint::getId).reversed());
  • Java 8+ 推荐写法:list.sort(...) 比 Collections.sort(list) 更直观,且支持 ArrayList 等支持随机访问的列表高效排序。

掌握 Comparable 与 Comparator 的协同使用,是 Java 集合排序的基石能力——既保障代码可读性,又兼顾性能与扩展性。