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

Java 8中如何通过自定义Comparator按指定枚举顺序排序Car对象列表?

自定义Comparator实现枚举指定顺序排序

没问题,咱们可以通过两种实用的方式来实现你要的排序需求,下面一步步给你讲清楚:

方法一:自定义顺序列表+Comparator

这种方式的好处是排序逻辑和枚举本身解耦,后续要调整顺序只需要修改列表就行,不用动枚举代码,灵活性更高。

  1. 先定义你想要的排序优先级列表:
// 按SEDAN → BMW → UNICORN的顺序排列
List<Model> desiredSortOrder = Arrays.asList(Model.SEDAN, Model.BMW, Model.UNICORN);
  1. 基于这个列表创建自定义Comparator:
    我们利用List.indexOf()方法获取每个Model在顺序列表中的索引,索引越小的元素排序越靠前。如果遇到不在列表中的Model(比如后续新增的枚举值),可以把它默认放到最后:
Comparator<Car> carModelComparator = Comparator.comparingInt(car -> {
    int index = desiredSortOrder.indexOf(car.getModel());
    // 不在指定顺序里的元素,放到最后
    return index == -1 ? desiredSortOrder.size() : index;
});
  1. 对Car列表执行排序:
    Java 8+的List自带sort()方法,直接调用即可完成排序:
l.sort(carModelComparator);

方法二:给枚举添加排序属性

如果排序逻辑和枚举本身强绑定,咱们可以直接给枚举加一个排序权重字段,这样代码更内聚,维护起来更集中。

  1. 修改你的Model枚举,添加排序优先级属性:
enum Model {
    BMW(1), SEDAN(0), UNICORN(2); // 数字越小,排序越靠前

    private final int sortPriority;

    Model(int sortPriority) {
        this.sortPriority = sortPriority;
    }

    public int getSortPriority() {
        return sortPriority;
    }
}
  1. 基于枚举的排序属性创建Comparator:
    这个实现就非常简洁了:
Comparator<Car> carModelComparator = Comparator.comparingInt(car -> car.getModel().getSortPriority());
  1. 同样调用sort()方法完成排序:
l.sort(carModelComparator);

完整测试代码

把方法一整合到你的原代码中,完整可运行的代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

enum Model { BMW, SEDAN, UNICORN }

public class Car {
    private Model model;
    private int id;

    public Car(Model model, int id) {
        super();
        this.model = model;
        this.id = id;
    }

    public Model getModel() {
        return model;
    }

    public void setModel(Model model) {
        this.model = model;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Car [model=" + model + ", id=" + id + "]";
    }

    public static void main(String[] args) {
        List<Car> l = new ArrayList<Car>();
        Car c1 = new Car(Model.BMW, 1);
        Car c2 = new Car(Model.BMW, 2);
        Car c3 = new Car(Model.SEDAN, 3);
        Car c4 = new Car(Model.SEDAN, 4);
        Car c5 = new Car(Model.SEDAN, 5);
        Car c6 = new Car(Model.UNICORN, 6);
        Car c7 = new Car(Model.BMW, 7);
        Car c8 = new Car(Model.BMW, 8);
        l.add(c1);
        l.add(c2);
        l.add(c3);
        l.add(c4);
        l.add(c5);
        l.add(c6);
        l.add(c7);
        l.add(c8);

        // 方法一:自定义顺序列表排序
        List<Model> desiredSortOrder = Arrays.asList(Model.SEDAN, Model.BMW, Model.UNICORN);
        Comparator<Car> carModelComparator = Comparator.comparingInt(car -> {
            int index = desiredSortOrder.indexOf(car.getModel());
            return index == -1 ? desiredSortOrder.size() : index;
        });
        l.sort(carModelComparator);

        // 打印排序后的结果
        System.out.println(l);
    }
}

运行这段代码,输出就会和你期望的完全一致啦!

内容的提问来源于stack exchange,提问作者Starbucks Admin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:27:28