• 容器排序——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 }

    这就很好用是吧:

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

  • 相关阅读:
    【BZOJ 3098】 Hash Killer II
    【BZOJ 1189】[HNOI2007]紧急疏散evacuate
    【BZOJ 1088】 [SCOI2005]扫雷Mine
    【BZOJ 1821】 [JSOI2010]Group 部落划分 Group
    【BZOJ 1013】 [JSOI2008]球形空间产生器sphere
    【BZOJ 1084】[SCOI2005]最大子矩阵
    【BZOJ 1085】 [SCOI2005]骑士精神
    JNday6-pm
    JNday6-am
    JNday5-pm
  • 原文地址:https://www.cnblogs.com/cxy2016/p/7152357.html
Copyright © 2020-2023  润新知