容器排序——List

将对象存储在容器中,不可避免的要出现排序的情况。现在就总结如何对List结构进行排序。

一个很初级的想法:对数组进行遍历,按照对象的属性进行排序。

如此就产生第一个简单的排序方法,遍历数组获取对象,通过冒泡排序法对数组进行排序。

 1 package Sort;
 2 
 3 import java.util.List;
 4 
 5 import javax.script.Compilable;
 6 
 7 public class Sort {
 8     public static void main(String args[]){
 9         Student[] students = {new Student(10, "陈"), 
10                 new Student(15, "惜"), new Student(9, "源")};
11         for(Student s : students)
12             System.out.println(s);
13         System.out.println("排序后");
14         sort(students);
15         for(Student s : students)
16             System.out.println(s);
17         
18     }
19     public static void sort(Object[] arr){
20         for(int i = 0; i < arr.length - 1; i++)
21             for(int j = 0; j < arr.length - i - 1; j++)
22                 if(((Student)arr[i]).age - ((Student)arr[i + 1]).age < 0){
23                     Object temp = new Object();
24                     temp = arr[i];
25                     arr[i] = arr[i + 1];
26                     arr[i + 1] = temp;
27                 }        
28     }
29 }
30 
31 class Student {
32     int age;
33     String name;
34     public Student(int age, String name) {
35         this.age = age;
36         this.name = name;
37     }
38     @Override
39     public String toString() {
40         return "Student [age=" + age + ", name=" + name + "]";
41     }
42 }

可以看到,这样可以按照Student类的age属性排序。

但是这样就出现一个问题:代码复用性不强,传入不同的类都要改写第22行的强制转换类型和取得的属性。

所以为了解决这个问题,我们借助于Comparable接口。

在Student中实现这个接口中的comparTo方法,就能解决以上问题:

 1 package Sort;
 2 
 3 import java.util.Comparator;
 4 import java.util.List;
 5 
 6 import javax.script.Compilable;
 7 
 8 public class Sort {
 9     public static void main(String args[]){
10         Student[] students = {new Student(10, "陈"), 
11                 new Student(15, "惜"), new Student(9, "源")};
12         for(Student s : students)
13             System.out.println(s);
14         System.out.println("排序后");
15         sort(students);
16         for(Student s : students)
17             System.out.println(s);
18         
19     }
20     public static void sort(List arr, Comparator pc){
21         Object[] objs = arr.toArray();
22         for(int i = 0; i < arr.size() - 1; i++)
23             for(int j = 0; j < arr.size() - i - 1; j++)
24                 if(pc.compare(objs[i + 1], objs[i]) < 0){
25                     Object temp = new Object();
26                     temp = arr.get(i);
27                     arr.set(i, arr.get(i + 1));
28                     arr.set(i + 1, temp);
29                 }        
30     }
31 }
32 
33 class Student implements Comparable<Student>{
34     int age;
35     String name;
36     public Student(int age, String name) {
37         this.age = age;
38         this.name = name;
39     }
40     @Override
41     public String toString() {
42         return "Student [age=" + age + ", name=" + name + "]";
43     }
44     @Override
45     public int compareTo(Student o) {
46         return this.age - o.age;
47     }
48     
49 }

实现了Comparable接口的compareTo方法,就可以实现比较自己想比较的属性。在sort方法中直接调用就可以,同时通过Comparable父类引用指向子类对象可以避免更改强制转换类型,增强了复用性。

下面可以看一个例子:一个新闻类,有属性(发布时间、点击量、标题)三个属性,按照(时间、点击量、标题)的优先级进行比较排序。

 1 package Sort;
 2 
 3 import java.util.Date;
 4 
 5 public class SortNews {
 6     public static void main(String args[]){
 7         News[] news = {new News(new Date(), 100, "123"), 
 8                 new News(new Date(), 160, "234"), 
 9                 new News(new Date(), 150, "123")};
10         
11         for(News n : news)
12             System.out.println(n);
13         System.out.println("sort后:");
14         sort(news);
15         for(News n : news)
16             System.out.println(n);
17     }
18     
19     public static void sort(Object[] arr){
20         for(int i = 0; i < arr.length - 1; i++)
21             for(int j = 0; j < arr.length - i - 1; j++)
22                 if(((Comparable)arr[i]).compareTo(arr[i + 1]) < 0){
23                     Object temp = new Object();
24                     temp = arr[i];
25                     arr[i] = arr[i + 1];
26                     arr[i + 1] = temp;
27                 }        
28     }
29 }
30 
31 class News implements Comparable<News>{
32     Date date;
33     int click;
34     String title;
35     
36     public News(Date date, int click, String title) {
37         this.date = date;
38         this.click = click;
39         this.title = title;
40     }
41 
42     @Override
43     public int compareTo(News o) {
44         if(this.date.equals(o.date))
45             if(this.click == o.click)
46                 return this.title.compareTo(o.title);
47             else
48                 return this.click - o.click;
49         else
50             return this.date.compareTo(o.date);
51     }
52 
53     @Override
54     public String toString() {
55         return "News [date=" + date.getTime() + ", click=" + click + ", title=" + title + "]";
56     }    
57     
58 }

这就很好用是吧:

下一章更深入的介绍一种设计模式来进行排序。

原文地址:https://www.cnblogs.com/cxy2016/p/7152357.html