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

如何按Java枚举定义顺序对Fruit枚举列表进行排序?

实现枚举列表的自定义顺序排序

默认Collections.sort()对枚举类型使用的是枚举声明时的ordinal顺序,这和你需要的自定义顺序不符,你可以通过以下两种方式实现需求:

方式一:标准排序(相同元素集中)

如果需要将相同枚举元素集中排列,仅调整整体的优先级顺序,可以自定义Comparator:

  1. 定义你需要的排序优先级列表:
List<Fruit> customSortOrder = Arrays.asList(Fruit.Apple, Fruit.Banana, Fruit.Orange, Fruit.Pineapple, Fruit.Grape);
  1. 创建基于该顺序的比较器:
Comparator<Fruit> customComparator = Comparator.comparingInt(customSortOrder::indexOf);
  1. 执行排序:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:57:39