如何实现按指定字段对Student POJO数组进行选择排序(不使用compareTo)
Java 多字段选择排序实现方案
先修正现有代码的已知问题
你写的swap方法存在参数类型笔误,形参Students[]多了后缀s,修正后代码如下:
private static void swap(Student[] list, int index1, int index2) { Student temp = list[index1]; list[index1] = list[index2]; list[index2] = temp; }
选择排序核心逻辑实现
无需让Student类实现Comparable接口、也不用自定义Student类的compareTo方法,直接根据传入的key取对应字段做值比较即可,完整代码如下:
private static void selectionSort(Student[] list, String key) { for (int i = 0; i < list.length - 1; i++) { int minIndex = i; for (int j = i + 1; j < list.length; j++) { boolean needUpdateMin = false; // 根据排序key走不同比较分支 switch (key) { case "age": needUpdateMin = list[j].getAge() < list[minIndex].getAge(); break; case "id": // 假设id是int/long等数值类型 needUpdateMin = list[j].getId() < list[minIndex].getId(); break; case "firstName": // 此处仅调用String类自带的compareTo方法,未使用自定义Student类的compareTo // 如果你要求完全不使用任何compareTo,可替换为下方注释的手动字符串比较逻辑 needUpdateMin = list[j].getFirstName().compareTo(list[minIndex].getFirstName()) < 0; // 完全不用compareTo的手动字符串比较逻辑 /* String str1 = list[j].getFirstName(); String str2 = list[minIndex].getFirstName(); int minLen = Math.min(str1.length(), str2.length()); for (int k = 0; k < minLen; k++) { if (str1.charAt(k) != str2.charAt(k)) { needUpdateMin = str1.charAt(k) < str2.charAt(k); break; } } if (!needUpdateMin && str1.length() < str2.length()) { needUpdateMin = true; } */ break; default: throw new IllegalArgumentException("不支持的排序字段:" + key); } if (needUpdateMin) { minIndex = j; } } // 内层循环结束后交换当前位置和最小元素位置 if (minIndex != i) { swap(list, i, minIndex); } } }
逻辑说明
- 数值类型的
age和id直接通过大小运算符比较即可,无需任何compareTo调用 - 字符串类型的
firstName默认用JDK自带的String类compareTo实现字典序判断,如果你要求完全不使用任何compareTo方法,放开代码中注释的手动字符逐位比较逻辑即可 - 加入了非法字段校验,避免传入不支持的排序字段时逻辑异常
内容的提问来源于stack exchange,提问作者techie_questie
相关产品推荐
相关产品推荐

