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

如何用冒泡排序(for循环)对SoccerPositions枚举按code值排序?

基于冒泡排序对SoccerPositions枚举数组按code属性排序的正确实现

先梳理你原代码里的核心问题:

  • 直接操作SoccerPositions.values()返回的数组:该数组是枚举类的固定实例数组,不允许修改,必须先复制一份独立数组再排序
  • 比较逻辑错误:不能直接用>比较枚举实例,要通过getCode()方法获取字符属性后再做比较
  • 辅助变量类型错误:枚举实例不能用int类型存储,必须用SoccerPositions类型
  • 冗余赋值逻辑:排序完成后无需再循环复制数组,直接返回排序后的数组即可

以下是修正后的完整SoccerPositions枚举类实现:

import java.util.Arrays;

public enum SoccerPositions {
    STRIKER("Most advance player in field", 'S'),
    MIDFIELDER("Organizes the game", 'M'),
    DEFENDER("Stops the striker", 'D');

    private final String description;
    private final char code;

    SoccerPositions(String description, char code) {
        this.description = description;
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public char getCode() {
        return code;
    }

    public static SoccerPositions[] getSoccerPositionsSortedbyCode() {
        // 复制枚举实例数组,避免修改原枚举数组
        SoccerPositions[] sortedPositions = Arrays.copyOf(values(), values().length);
        int length = sortedPositions.length;

        // 冒泡排序核心逻辑
        for (int i = 0; i < length - 1; i++) {
            // 每一轮排序后,末尾i个元素已处于有序状态,无需重复比较
            for (int j = 0; j < length - 1 - i; j++) {
                // 比较当前元素与下一个元素的code值
                if (sortedPositions[j].getCode() > sortedPositions[j + 1].getCode()) {
                    // 交换两个元素的位置
                    SoccerPositions temp = sortedPositions[j];
                    sortedPositions[j] = sortedPositions[j + 1];
                    sortedPositions[j + 1] = temp;
                }
            }
        }

        return sortedPositions;
    }
}

关键细节说明

  1. 数组复制:使用Arrays.copyOf()复制原枚举数组,确保操作的是独立的新数组,不会影响枚举类的原始实例数组。如果你不想用工具类,也可以手动循环复制:
    SoccerPositions[] sortedPositions = new SoccerPositions[values().length];
    for (int k = 0; k < values().length; k++) {
        sortedPositions[k] = values()[k];
    }
    
  2. 冒泡排序逻辑:外层循环控制排序轮次,每一轮会把当前未排序部分的最大元素"冒泡"到末尾;内层循环负责相邻元素的比较与交换,每一轮的比较次数随已排序元素增多而减少。
  3. 属性比较:通过getCode()获取每个枚举实例的字符属性,利用字符的ASCII值大小关系完成排序('D' < 'M' < 'S')。

内容的提问来源于stack exchange,提问作者Jorge D. García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:42:22