Java 8中如何通过自定义Comparator按指定枚举顺序排序Car对象列表?
自定义Comparator实现枚举指定顺序排序
没问题,咱们可以通过两种实用的方式来实现你要的排序需求,下面一步步给你讲清楚:
方法一:自定义顺序列表+Comparator
这种方式的好处是排序逻辑和枚举本身解耦,后续要调整顺序只需要修改列表就行,不用动枚举代码,灵活性更高。
- 先定义你想要的排序优先级列表:
// 按SEDAN → BMW → UNICORN的顺序排列 List<Model> desiredSortOrder = Arrays.asList(Model.SEDAN, Model.BMW, Model.UNICORN);
- 基于这个列表创建自定义Comparator:
我们利用List.indexOf()方法获取每个Model在顺序列表中的索引,索引越小的元素排序越靠前。如果遇到不在列表中的Model(比如后续新增的枚举值),可以把它默认放到最后:
Comparator<Car> carModelComparator = Comparator.comparingInt(car -> { int index = desiredSortOrder.indexOf(car.getModel()); // 不在指定顺序里的元素,放到最后 return index == -1 ? desiredSortOrder.size() : index; });
- 对Car列表执行排序:
Java 8+的List自带sort()方法,直接调用即可完成排序:
l.sort(carModelComparator);
方法二:给枚举添加排序属性
如果排序逻辑和枚举本身强绑定,咱们可以直接给枚举加一个排序权重字段,这样代码更内聚,维护起来更集中。
- 修改你的Model枚举,添加排序优先级属性:
enum Model { BMW(1), SEDAN(0), UNICORN(2); // 数字越小,排序越靠前 private final int sortPriority; Model(int sortPriority) { this.sortPriority = sortPriority; } public int getSortPriority() { return sortPriority; } }
- 基于枚举的排序属性创建Comparator:
这个实现就非常简洁了:
Comparator<Car> carModelComparator = Comparator.comparingInt(car -> car.getModel().getSortPriority());
- 同样调用
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
相关产品推荐
相关产品推荐

