将对象存储在容器中,不可避免的要出现排序的情况。现在就总结如何对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 }
这就很好用是吧:
下一章更深入的介绍一种设计模式来进行排序。