如何按Java枚举定义顺序对Fruit枚举列表进行排序?
实现枚举列表的自定义顺序排序
默认Collections.sort()对枚举类型使用的是枚举声明时的ordinal顺序,这和你需要的自定义顺序不符,你可以通过以下两种方式实现需求:
方式一:标准排序(相同元素集中)
如果需要将相同枚举元素集中排列,仅调整整体的优先级顺序,可以自定义Comparator:
- 定义你需要的排序优先级列表:
List<Fruit> customSortOrder = Arrays.asList(Fruit.Apple, Fruit.Banana, Fruit.Orange, Fruit.Pineapple, Fruit.Grape);
- 创建基于该顺序的比较器:
Comparator<Fruit> customComparator = Comparator.comparingInt(customSortOrder::indexOf);
- 执行排序:
Collections.sort(fruits, customComparator);
排序后结果为:Apple, Apple, Banana, Banana, Orange, Pineapple, Grape,符合自定义优先级的标准排序逻辑。
方式二:按指定序列排列(非分组)
如果确实需要得到Apple,Banana,Orange,Pineapple,Grape,Apple,Banana这种先按顺序各取一个、再追加剩余元素的结果,需要手动构建列表而非使用排序:
// 统计列表中各枚举元素的数量 Map<Fruit, Integer> fruitCount = new HashMap<>(); for (Fruit f : fruits) { fruitCount.put(f, fruitCount.getOrDefault(f, 0) + 1); } // 构建结果列表 List<Fruit> sortedFruits = new ArrayList<>(); List<Fruit> customOrder = Arrays.asList(Fruit.Apple, Fruit.Banana, Fruit.Orange, Fruit.Pineapple, Fruit.Grape); // 先按顺序添加每个元素一次 for (Fruit f : customOrder) { int count = fruitCount.getOrDefault(f, 0); if (count > 0) { sortedFruits.add(f); fruitCount.put(f, count - 1); } } // 追加剩余的元素 for (Fruit f : customOrder) { int remaining = fruitCount.getOrDefault(f, 0); for (int i = 0; i < remaining; i++) { sortedFruits.add(f); } }
此时sortedFruits就是你期望的结果:Apple,Banana,Orange,Pineapple,Grape,Apple,Banana。
内容的提问来源于stack exchange,提问作者yasin
相关产品推荐
相关产品推荐

