本文实例讲述了Java针对ArrayList自定义排序的2种实现方法。分享给大家供大家参考,具体如下:
Java中实现对list的自定义排序主要通过两种方式
1)让需要进行排序的对象的类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.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
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( "学号:" + 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); } } |
结果:
1
2
3
4
5
6
7
8
9
10
11
12
|
before sorted 学号: 1 姓名:A 年龄 20 身高: 180 学号: 2 姓名:B 年龄 21 身高: 175 学号: 3 姓名:C 年龄 22 身高: 190 学号: 4 姓名:D 年龄 21 身高: 170 学号: 5 姓名:E 年龄 20 身高: 185 after age and height sorted 学号: 1 姓名:A 年龄 20 身高: 180 学号: 5 姓名:E 年龄 20 身高: 185 学号: 4 姓名:D 年龄 21 身高: 170 学号: 2 姓名:B 年龄 21 身高: 175 学号: 3 姓名:C 年龄 22 身高: 190 |
2)实现比较器接口Comparator,重写compare方法,直接当做参数传进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( "学号:" + 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); } } |
输出结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
before sorted 学号: 1 姓名:A 年龄 20 身高: 180 学号: 2 姓名:B 年龄 21 身高: 175 学号: 3 姓名:C 年龄 22 身高: 190 学号: 4 姓名:D 年龄 21 身高: 170 学号: 5 姓名:E 年龄 20 身高: 185 after age sorted 学号: 1 姓名:A 年龄 20 身高: 180 学号: 5 姓名:E 年龄 20 身高: 185 学号: 2 姓名:B 年龄 21 身高: 175 学号: 4 姓名:D 年龄 21 身高: 170 学号: 3 姓名:C 年龄 22 身高: 190 after age and height sorted 学号: 1 姓名:A 年龄 20 身高: 180 学号: 5 姓名:E 年龄 20 身高: 185 学号: 4 姓名:D 年龄 21 身高: 170 学号: 2 姓名:B 年龄 21 身高: 175 学号: 3 姓名:C 年龄 22 身高: 190 |
单从上面的例子可以看出排序是稳定的,去看了下java的Collections.sort
的源代码,确实是基于稳定的归并排序实现的,内部还做了优化,叫TimSort。(关于TimSort还可参考https://baike.baidu.com/item/TimSort?fr=aladdin)
希望本文所述对大家java程序设计有所帮助。
原文链接:http://blog.csdn.net/tc_to_top/article/details/52525771