本文實例講述了Java針對ArrayList自定義排序的2種實現(xiàn)方法。分享給大家供大家參考,具體如下:
Java中實現(xiàn)對list的自定義排序主要通過兩種方式
1)讓需要進行排序的對象的類實現(xiàn)Comparable接口,重寫compareTo(T o)方法,在其中定義排序規(guī)則,那么就可以直接調(diào)用Collections.sort()來排序?qū)ο髷?shù)組
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
public class Student implements Comparable{ private int id; private int age; private int height; private String name; public Student( int id, String name, int age, int height) { this .id = id; this .name = name; this .age = age; this .height = height; } public int getId() { return id; } public int getAge() { return age; } public int getHeight() { return height; } public String getName() { return name; } public void setId( int id) { this .id = id; } public void setAge( int age) { this .age = age; } public void setName(String name) { this .name = name; } public void setHeight( int height) { this .height = height; } @Override public int compareTo(Object o) { Student s = (Student) o; if ( this .age > s.age) { return 1 ; } else if ( this .age < s.age) { return - 1 ; } else { if ( this .height >= s.height) { return 1 ; } else { return - 1 ; } } } } |
測試類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.util.*; public class Test { public static void printData(List<Student> list) { for (Student student : list) { System.out.println( "學(xué)號:" + student.getId() + " 姓名:" + student.getName() + " 年齡" + student.getAge() + " 身高:" + student.getHeight()); } } public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add( new Student( 1 , "A" , 20 , 180 )); list.add( new Student( 2 , "B" , 21 , 175 )); list.add( new Student( 3 , "C" , 22 , 190 )); list.add( new Student( 4 , "D" , 21 , 170 )); list.add( new Student( 5 , "E" , 20 , 185 )); System.out.println( "before sorted" ); printData(list); Collections.sort(list); System.out.println( "after age and height sorted" ); printData(list); } } |
結(jié)果:
1
2
3
4
5
6
7
8
9
10
11
12
|
before sorted 學(xué)號: 1 姓名:A 年齡 20 身高: 180 學(xué)號: 2 姓名:B 年齡 21 身高: 175 學(xué)號: 3 姓名:C 年齡 22 身高: 190 學(xué)號: 4 姓名:D 年齡 21 身高: 170 學(xué)號: 5 姓名:E 年齡 20 身高: 185 after age and height sorted 學(xué)號: 1 姓名:A 年齡 20 身高: 180 學(xué)號: 5 姓名:E 年齡 20 身高: 185 學(xué)號: 4 姓名:D 年齡 21 身高: 170 學(xué)號: 2 姓名:B 年齡 21 身高: 175 學(xué)號: 3 姓名:C 年齡 22 身高: 190 |
2)實現(xiàn)比較器接口Comparator,重寫compare方法,直接當做參數(shù)傳進sort中
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 Student { private int id; private int age; private int height; private String name; public Student( int id, String name, int age, int height) { this .id = id; this .name = name; this .age = age; this .height = height; } public int getId() { return id; } public int getAge() { return age; } public int getHeight() { return height; } public String getName() { return name; } public void setId( int id) { this .id = id; } public void setAge( int age) { this .age = age; } public void setName(String name) { this .name = name; } public void setHeight( int height) { this .height = height; } } |
測試類:
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
41
42
43
44
45
46
47
48
49
50
51
52
|
import java.util.*; public class Test { public static void printData(List<Student> list) { for (Student student : list) { System.out.println( "學(xué)號:" + student.getId() + " 姓名:" + student.getName() + " 年齡" + student.getAge() + " 身高:" + student.getHeight()); } } public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add( new Student( 1 , "A" , 20 , 180 )); list.add( new Student( 2 , "B" , 21 , 175 )); list.add( new Student( 3 , "C" , 22 , 190 )); list.add( new Student( 4 , "D" , 21 , 170 )); list.add( new Student( 5 , "E" , 20 , 185 )); System.out.println( "before sorted" ); printData(list); Collections.sort(list, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { if (o1.getAge() >= o2.getAge()) { return 1 ; } else { return - 1 ; } } }); System.out.println( "after age sorted" ); printData(list); Collections.sort(list, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { if (o1.getAge() > o2.getAge()) { return 1 ; } else if (o1.getAge() < o2.getAge()){ return - 1 ; } else { if (o1.getHeight() >= o2.getHeight()) { return 1 ; } else { return - 1 ; } } } }); System.out.println( "after age and height sorted" ); printData(list); } } |
輸出結(jié)果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
before sorted 學(xué)號: 1 姓名:A 年齡 20 身高: 180 學(xué)號: 2 姓名:B 年齡 21 身高: 175 學(xué)號: 3 姓名:C 年齡 22 身高: 190 學(xué)號: 4 姓名:D 年齡 21 身高: 170 學(xué)號: 5 姓名:E 年齡 20 身高: 185 after age sorted 學(xué)號: 1 姓名:A 年齡 20 身高: 180 學(xué)號: 5 姓名:E 年齡 20 身高: 185 學(xué)號: 2 姓名:B 年齡 21 身高: 175 學(xué)號: 4 姓名:D 年齡 21 身高: 170 學(xué)號: 3 姓名:C 年齡 22 身高: 190 after age and height sorted 學(xué)號: 1 姓名:A 年齡 20 身高: 180 學(xué)號: 5 姓名:E 年齡 20 身高: 185 學(xué)號: 4 姓名:D 年齡 21 身高: 170 學(xué)號: 2 姓名:B 年齡 21 身高: 175 學(xué)號: 3 姓名:C 年齡 22 身高: 190 |
單從上面的例子可以看出排序是穩(wěn)定的,去看了下java的Collections.sort
的源代碼,確實是基于穩(wěn)定的歸并排序?qū)崿F(xiàn)的,內(nèi)部還做了優(yōu)化,叫TimSort。(關(guān)于TimSort還可參考https://baike.baidu.com/item/TimSort?fr=aladdin)
希望本文所述對大家java程序設(shè)計有所幫助。
原文鏈接:http://blog.csdn.net/tc_to_top/article/details/52525771