如何用冒泡排序(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; } }
关键细节说明
- 数组复制:使用
Arrays.copyOf()复制原枚举数组,确保操作的是独立的新数组,不会影响枚举类的原始实例数组。如果你不想用工具类,也可以手动循环复制:SoccerPositions[] sortedPositions = new SoccerPositions[values().length]; for (int k = 0; k < values().length; k++) { sortedPositions[k] = values()[k]; } - 冒泡排序逻辑:外层循环控制排序轮次,每一轮会把当前未排序部分的最大元素"冒泡"到末尾;内层循环负责相邻元素的比较与交换,每一轮的比较次数随已排序元素增多而减少。
- 属性比较:通过
getCode()获取每个枚举实例的字符属性,利用字符的ASCII值大小关系完成排序('D' < 'M' < 'S')。
内容的提问来源于stack exchange,提问作者Jorge D. García
相关产品推荐
相关产品推荐

