Arrays.sort()
Prerequisites:
sort()
預設是由小到大,可自訂排序方式由大到小。
使用Arrays.sort()會影嚮陣列中原本的位置。
1
2
3
4
int[] arr = {-1, 5, -2, 10};
System.out.println("排序前:" + Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("排序後:" + Arrays.toString(arr));
排序前:[-1, 5, -2, 10]
排序後:[-2, -1, 5, 10]
自訂排序大小
- 陣列不能是基本型態,必須是包裝類別Wrapper Classes。
- 使用匿名類別,實作Comparator介面。
- 由小到大,是o1 - o2。
- 由大到小,是o2 - o1。
語法
Arrays.sort(陣列, 自訂排序介面)
1
2
3
4
5
6
7
8
9
Integer[] arr = {-1, 5, -2, 10};
System.out.println("排序前:" + Arrays.toString(arr));
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println("排序後:" + Arrays.toString(arr));
排序前:[-1, 5, -2, 10]
排序後:[10, 5, -1, -2]
自己寫MyArrays.sort()
自己寫一個MyArrays.sort(陣列, Comparator)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Test {
public static void main(String[] args) {
int[] arr = {-1, 5, 1, 10, 0, 7};
// 由小到大
MyArrays.sort(arr, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
// 自動拆箱
int i1 = (Integer) o1;
int i2 = (Integer) o2;
return i1 - i2;
}
});
System.out.println("排序後 : " + Arrays.toString(arr));
}
}
class MyArrays {
public static void sort(int[] arr, Comparator comparator) {
int loop_count = arr.length - 1;
for (int i = loop_count; i > 0; i--) {
for (int j = 0; j < i; j++) {
// arr[j] - arr[j + 1] 傳回 正數 ,代表arr[j] > arr[j + 1]
// arr[j] - arr[j + 1] 傳回 負數 ,代表arr[j] < arr[j + 1]
if(comparator.compare(arr[j] , arr[j + 1]) > 0) {
// 交換
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
比較日期
有一個陣列,陣列的值是日期物件,排序這些日期物件。
日期物件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class MyDate2 {
private int year;
private int mon;
private int day;
public int getYear() {
return year;
}
public int getMon() {
return mon;
}
public int getDay() {
return day;
}
public MyDate2(int year, int mon, int day) {
this.year = year;
this.mon = mon;
this.day = day;
}
@Override
public String toString() {
return "\nMyDate2{" +
"year=" + year +
", mon=" + mon +
", day=" + day +
'}';
}
}
Comparator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Test {
public static void main(String[] args) {
// 透過匿名類別建立物件
Comparator<MyDate2> comparator = new Comparator<MyDate2>() {
@Override
public int compare(MyDate2 o1, MyDate2 o2) {
// 由小到大 o1 - o2
int diff_y = o1.getYear() - o2.getYear();
// 不相等代表比較出結果,直接傳回比較結果
// 之後的程式就沒必要再比較。
if (diff_y != 0) {
return diff_y;
}
int diff_m = o1.getMon() - o2.getMon();
if (diff_m != 0) {
return diff_m;
}
int diff_day = o1.getDay() - o2.getDay();
if (diff_day != 0) {
return diff_day;
}
return 0;
}
};
// 建立Array,裡面的內容是沒按照年月日順序
MyDate2[] arr = {
new MyDate2(2000, 11, 10),
new MyDate2(2000, 1, 1),
new MyDate2(2000, 3, 1)
};
// 陣列排序,把Comparator傳入。
Arrays.sort(arr, comparator);
System.out.println(Arrays.toString(arr));
}
}
[
MyDate2{year=2000, mon=1, day=1},
MyDate2{year=2000, mon=3, day=1},
MyDate2{year=2000, mon=11, day=10}]
結果由小到大排列。
由大到小
想把排序結果由大到小排列,只要把o1與o2位置顛倒。
o2.getYear() - o1.getYear()
o2.getMon() - o1.getMon()
o2.getDay() - o1.getDay()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Test {
public static void main(String[] args) {
MyDate2 myDate2 = new MyDate2(2000, 11, 11);
MyDate2 another = new MyDate2(2000, 11, 10);
// 透過匿名類別建立物件
Comparator<MyDate2> comparator = new Comparator<MyDate2>() {
@Override
public int compare(MyDate2 o1, MyDate2 o2) {
// 由大到小
int diff_y = o2.getYear() - o1.getYear();
if (diff_y != 0) {
return diff_y;
}
int diff_m = o2.getMon() - o1.getMon();
if (diff_m != 0) {
return diff_m;
}
int diff_day = o2.getDay() - o1.getDay();
if (diff_day != 0) {
return diff_day;
}
return 0;
}
};
MyDate2[] arr = {
new MyDate2(2000, 11, 10),
new MyDate2(2000, 1, 1),
new MyDate2(2000, 3, 1)
};
Arrays.sort(arr, comparator);
System.out.println(Arrays.toString(arr));
}
}
[
MyDate2{year=2000, mon=11, day=10},
MyDate2{year=2000, mon=3, day=1},
MyDate2{year=2000, mon=1, day=1}]
結果由大到小排列。