這段 Java 代碼展示了兩種排序方式的用法,分別是:
- 對普通數組進行排序(
Integer[] nums
) - 對對象數組進行排序(
Student[] students
)
我來一步步給你講清楚:
? 第1部分:普通數組降序排序
static Integer[] nums = {3, 1, 4, 1, 5, 9};
- 這是一個整型對象數組(
Integer[]
),不是基礎類型int[]
,因為Arrays.sort
的自定義排序器只接受對象數組。 - 接下來用一個 匿名內部類 實現
Comparator<Integer>
:
Arrays.sort(nums, new Comparator<Integer>() {@Overridepublic 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
就是降序的排序。
? 第2部分:對象數組排序(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>() {@Overridepublic 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 是奇數,b 是偶數:
- 例如 a = 3, b = 4
a % 2 == 1
成立return (a % 2 == 1) ? -1 : 1;
→ 返回-1
- 表示 a < b,奇數排在前
? 如果 a 是偶數,b 是奇數:
- 例如 a = 4, b = 3
a % 2 == 1
不成立- 返回
1
,表示 a > b,偶數排在后
? 四、這個排序實現的最終目標:
把數組中的奇數排在前面、偶數排在后面,且各自內部都是升序排列。
? 補充一嘴:為什么用 a - b
可以比較大小?
a - b
本質上是:
- 負值 → a 小于 b
- 0 → 相等
- 正值 → a 大于 b
這正好符合 compare(a, b)
函數需要的三種返回情況。
你現在遇到這個錯誤是因為你混用了兩種類型:
🚫 報錯解釋
Arrays.sort(int[], Comparator)
:這是錯誤的,因為你傳入的是int[]
(基本類型數組),但帶Comparator
的排序方法 只能用于對象類型的數組,比如Integer[]
。Arrays.sort(ArrayList<Integer>, Comparator)
:這是錯誤的,因為Arrays.sort()
只接受數組(T[]
),而ArrayList
是一個集合,不是數組。
? 正確的寫法(取決于你用什么類型)
? 如果你用的是 數組:
Integer[] arr = {3, 1, 4, 2}; // 注意:是 Integer[] 不是 int[]Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic 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:
ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(4);
list.add(2);Collections.sort(list, new Comparator<Integer>() {@Overridepublic 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<T> | Collections.sort(list, cmp) | ? 正確 |
如果你告訴我你用的是哪種變量(int[]
、Integer[]
、ArrayList<Integer>
),我可以直接幫你寫出完整的正確代碼。你現在代碼中變量是哪個?