Java 排序的两种常见比较方式是什么?
查看完整题解
参考回答
直接回答
常见的两种方式是:让类型实现 Comparable,定义自然顺序;或在排序时传入 Comparator,定义本次使用的顺序。前者把默认比较规则写在类型中,后者适合多种排序口径。它们描述比较规则,不是 Java 只有两种排序算法。
讲清原理
compareTo 或 compare 的负数、零、正数分别表示小于、相等、大于,不要求恰好返回 -1、0、1。比较规则要保持对称方向与传递性,否则排序和有序容器可能出现错误。
List.sort、Collections.sort 能使用这些规则;对象数组可用 Arrays.sort。同一批员工可以按工号自然排序,也能按薪资再按工号排序。比较结果相同与 equals 相等的区别,在 TreeSet、TreeMap 中尤其重要。
例子与易错点
Java 21 的 main 片段:
var names = new java.util.ArrayList<>(java.util.List.of("bbb", "aa", "c"));
names.sort(java.util.Comparator.comparingInt(String::length)
.thenComparing(java.util.Comparator.naturalOrder()));
System.out.println(names);
输出 [c, aa, bbb]。先按长度,长度相同时按文本自然顺序。比较整数时宜用 Integer.compare 等方法,别直接相减:极值相减可能溢出,把大于关系算成小于。排序会改变列表,若要保留原顺序,应先复制结构。
相关题:第 4 题、第 6 题、第 48 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。