这段 Java 代码展示了两种排序方式的用法,分别是:
Integer[] nums
)Student[] students
)我来一步步给你讲清楚:
static Integer[] nums = {3, 1, 4, 1, 5, 9};
Integer[]
),不是基础类型 int[]
,因为 Arrays.sort
的自定义排序器只接受对象数组。Comparator
:Arrays.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return b - a; // 降序:大的在前
}
});
Arrays.sort(数组, 比较器)
会按照你提供的规则来排。
compare(a, b)
返回:
0 表示
a > b
,a
应该排在后面(升序)
<0 表示 a < b
,a
应该排在前面
所以 return b - a
就是降序的排序。
Student[]
)static class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
}
定义了一个 Student
类,每个学生有两个属性:名字和成绩。
然后我们有一个数组:
Student[] students = {
new Student("Alice", 90),
new Student("Bob", 85)
};
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student a, Student b) {
if (a.score != b.score)
return b.score - a.score; // 分数高的在前,降序
return a.name.compareTo(b.name); // 分数相同按名字升序
}
});
内容 | 解释 |
---|---|
Arrays.sort(数组, Comparator) |
对数组自定义排序 |
return a - b |
升序 |
return b - a |
降序 |
对象数组 |
需要根据字段来自定义排序 |
compareTo() |
比较字符串大小的方法 |
如果你想打印排序后的结果,也可以加上:
System.out.println(Arrays.toString(nums)); // 打印排序后的数字数组
for (Student s : students) {
System.out.println(s.name + " " + s.score);
}
这个问题问得非常好!我们来详细解释一下 Java 中 Comparator
的排序规则,尤其是 compare(a, b)
这个函数的返回值含义:
compare(a, b)
的返回值含义:在 Java 的排序逻辑中(比如 Arrays.sort()
使用的 Comparator
):
compare(a, b) 返回值 |
意义 |
---|---|
< 0 |
表示 a < b,a排前面 |
= 0 |
表示 a = b,位置不变 |
> 0 |
表示 a > b,a排后面 |
return a - b
比如 a = 3, b = 5:
return a - b = 3 - 5 = -2;
因为是负数,表示 a < b,3 会排在 5 前面,这就实现了升序排序。
a % 2 == 1
成立return (a % 2 == 1) ? -1 : 1;
→ 返回 -1
a % 2 == 1
不成立1
,表示 a > b,偶数排在后把数组中的奇数排在前面、偶数排在后面,且各自内部都是升序排列。
a - b
可以比较大小?a - b
本质上是:
这正好符合 compare(a, b)
函数需要的三种返回情况。
你现在遇到这个错误是因为你混用了两种类型:
Arrays.sort(int[], Comparator)
:这是错误的,因为你传入的是 int[]
(基本类型数组),但带 Comparator
的排序方法 只能用于对象类型的数组,比如 Integer[]
。Arrays.sort(ArrayList, Comparator)
:这是错误的,因为 Arrays.sort()
只接受数组(T[]
),而 ArrayList
是一个集合,不是数组。Integer[] arr = {3, 1, 4, 2}; // 注意:是 Integer[] 不是 int[]
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
// 偶数 > 奇数;相同奇偶性按升序
if (a % 2 == b % 2) return a - b;
return (a % 2 == 1) ? -1 : 1;
}
});
System.out.println(Arrays.toString(arr)); // [1, 3, 2, 4]
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(4);
list.add(2);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
if (a % 2 == b % 2) return a - b;
return (a % 2 == 1) ? -1 : 1;
}
});
System.out.println(list); // [1, 3, 2, 4]
你用的是什么 | 排序方法 | 要求的类型 |
---|---|---|
int[] |
Arrays.sort(arr) |
无法使用 Comparator |
Integer[] |
Arrays.sort(arr, cmp) |
✅ 可以使用 Comparator |
ArrayList |
Collections.sort(list, cmp) |
✅ 正确 |
如果你告诉我你用的是哪种变量(int[]
、Integer[]
、ArrayList
),我可以直接帮你写出完整的正确代码。你现在代码中变量是哪个?