zoukankan      html  css  js  c++  java
  • JAVA Comparator 接口排序用法

    java的比较器有两类,分别是Comparable接口和Comparator接口。

    在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口。

    让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下:

    [java] view plain copy
     
    1. class Student implements Comparable<Student>{  
    2.     private String name;  
    3.     private int age;  
    4.     private float score;  
    5.       
    6.     public Student(String name, int age, float score) {  
    7.         this.name = name;  
    8.         this.age = age;  
    9.         this.score = score;  
    10.     }  
    11.       
    12.     public String toString()  
    13.     {  
    14.         return name+" "+age+" "+score;  
    15.     }  
    16.   
    17.     @Override  
    18.     public int compareTo(Student o) {  
    19.         // TODO Auto-generated method stub  
    20.         if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部  
    21.             return -1;//由高到底排序  
    22.         else if(this.score<o.score)  
    23.             return 1;  
    24.         else{  
    25.             if(this.age>o.age)  
    26.                 return 1;//由底到高排序  
    27.             else if(this.age<o.age)  
    28.                 return -1;  
    29.             else  
    30.                 return 0;  
    31.         }  
    32.     }  
    33. }  
    34.   
    35. public class ComparableDemo01 {  
    36.   
    37.     /** 
    38.      * @param args 
    39.      */  
    40.     public static void main(String[] args) {  
    41.         // TODO Auto-generated method stub  
    42.         Student stu[]={new Student("zhangsan",20,90.0f),  
    43.                 new Student("lisi",22,90.0f),  
    44.                 new Student("wangwu",20,99.0f),  
    45.                 new Student("sunliu",22,100.0f)};  
    46.         java.util.Arrays.sort(stu);  
    47.         for(Student s:stu)  
    48.         {  
    49.             System.out.println(s);  
    50.         }  
    51.     }  
    52. }  

    在上面的程序中,实现了Comparable接口,并重写了compareTo方法,将学生先按成绩由大到小排名,成绩相同时候按照年龄由低到高排序。

     

    执行的结果是

    sunliu 22 100.0
    wangwu 20 99.0
    zhangsan 20 90.0
    lisi 22 90.0

     

    但是在设计类的时候,可能没有考虑到让类实现Comparable接口,那么就需要用到另外的一个比较器接口Comparator。

    从上面的实例我们可以发现,compareTo(T o)只有一个参数,而Comparator接口中必须要实现的compare(T o1,T o2)就有两个参数。

     

    代码实例

    1. package edu.sjtu.ist.comutil;  
    2.   
    3. import java.util.Comparator;  
    4.   
    5. class Student {  
    6.     private String name;  
    7.     private int age;  
    8.     private float score;  
    9.       
    10.     public Student(String name, int age, float score) {  
    11.         this.name = name;  
    12.         this.age = age;  
    13.         this.score = score;  
    14.     }  
    15.   
    16.     public String getName() {  
    17.         return name;  
    18.     }  
    19.     public void setName(String name) {  
    20.         this.name = name;  
    21.     }  
    22.     public int getAge() {  
    23.         return age;  
    24.     }  
    25.     public void setAge(int age) {  
    26.         this.age = age;  
    27.     }  
    28.     public float getScore() {  
    29.         return score;  
    30.     }  
    31.     public void setScore(float score) {  
    32.         this.score = score;  
    33.     }  
    34.   
    35.     public String toString()  
    36.     {  
    37.         return name+" "+age+" "+score;  
    38.     }  
    39.   
    40. }  
    41.   
    42. class StudentComparator implements Comparator<Student>{  
    43.   
    44.     @Override  
    45.     public int compare(Student o1, Student o2) {  
    46.         // TODO Auto-generated method stub  
    47.         if(o1.getScore()>o2.getScore())  
    48.             return -1;  
    49.         else if(o1.getScore()<o2.getScore())  
    50.             return 1;  
    51.         else{  
    52.             if(o1.getAge()>o2.getAge())  
    53.                 return 1;  
    54.             else if(o1.getAge()<o2.getAge())  
    55.                 return -1;  
    56.             else   
    57.                 return 0;  
    58.         }  
    59.     }  
    60.       
    61. }  
    62.   
    63.   
    64. public class ComparableDemo02 {  
    65.   
    66.     /** 
    67.      * @param args 
    68.      */  
    69.     public static void main(String[] args) {  
    70.         // TODO Auto-generated method stub  
    71.   
    72.         Student stu[]={new Student("zhangsan",20,90.0f),  
    73.                 new Student("lisi",22,90.0f),  
    74.                 new Student("wangwu",20,99.0f),  
    75.                 new Student("sunliu",22,100.0f)};  
    76.         java.util.Arrays.sort(stu,new StudentComparator());  
    77.         for(Student s:stu)  
    78.         {  
    79.             System.out.println(s);  
    80.         }  
    81.     }  
    82.   
    83. }  

    上面依然是对student对象数组进行排序,用的都是Array.sort方法,不同的是实现comparator接口时,sort方法需要传进来两个参数,即stu对象数组,以及重写的实现了comparator比较方法类。

     

    程序运行的结果和上面是一样的

     

     

    Array.sort是对数组进行排序,假如我们不想使用数组,想使用Collection接口下的集合,如想使用List,那么需要稍微做些修改:

     

    package comparatorTest;
     
    /**
    * 定义一个学生类
    * 包括学号,姓名,数学成绩,语文成绩
    * @author zhangnan
    *
    */
     
    public class Student{
    private String Name;
    private int ID;
    private int scoreMath;
    private int scoreChi;
    public Student (String name,int ID,int score1,int score2){
    this.Name=name;
    this.ID=ID;
    this.scoreMath=score1;
    this.scoreChi=score2;
    }
    public String getName(){
    return this.Name;
    }
    public void setName(String pname){
    this.Name=pname;
    }
    public int getID(){
    return this.ID;
    }
    public void setID(int pID){
    this.ID=pID;
    }
    public int getMathScore(){
    return scoreMath;
    }
    public void setMathScore(int score1){
    this.scoreMath=score1;
    }
    public float getChiScore(){
    return scoreChi;
    }
    public void setChiScore(int score2){
    this.scoreChi=score2;
    }
    /**
    * 返回学生信息
    */
    public String toString(){
    return Integer.toString(ID)+" "+Name+" "+Integer.toString(scoreMath)+" "+Integer.toString(scoreChi);
    }
     
     
    }
    --------------------------------------------------------------------------------
    package comparatorTest;
     
    import java.util.Comparator;
     
    public class ComparatorSort implements Comparator<Student> {
     
    public int compare(Student s1, Student s2) {
    // TODO Auto-generated method stub
    if (s1.getID() > s2.getID()) {
    return 1;
    } else if (s1.getID() < s2.getID()) {
    return -1;
    } else {
    if (s1.getMathScore() > s2.getMathScore())
    return -1;
    else if (s1.getMathScore() < s2.getMathScore())
    return 1;
    else
    return 0;
    }
     
    }
     
    }
    --------------------------------------------------------------------------------
    package comparatorTest;
     
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Random;
     
    public class test {
     
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Random random=new Random();
    ArrayList<Student> st=new ArrayList<Student>();
    Student s1= new Student("zhangnan1",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    Student s2= new Student("zhangnan2",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    Student s3= new Student("zhangnan3",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    Student s4= new Student("zhangnan4",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    st.add(s1);
    st.add(s2);
    st.add(s3);
    st.add(s4);
    System.out.println("全部的学生:");
    Collections.sort(st,new ComparatorSort());
    for(Student s:st){
     
    System.out.println(s);
    }
     
    }
     
    }
     
     
    重写的compare方法按照随机生成的学生ID排序,其次按照数学成绩排序,生成的结果是:

     

     

    全部的学生:

    0zhangnan3 6778

    0zhangnan2 390

    2zhangnan1 5796

    3zhangnan4 6253

    在这里我们没有使用对象数组,而是使用了Collection 接口下的ArrayList 集合,所以排序用的是Collections.sort(st,new ComparatorSort())

     

    java的比较器有两类,分别是Comparable接口和Comparator接口。

    在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口。

    让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下:

    [java] view plain copy
     
    1. class Student implements Comparable<Student>{  
    2.     private String name;  
    3.     private int age;  
    4.     private float score;  
    5.       
    6.     public Student(String name, int age, float score) {  
    7.         this.name = name;  
    8.         this.age = age;  
    9.         this.score = score;  
    10.     }  
    11.       
    12.     public String toString()  
    13.     {  
    14.         return name+" "+age+" "+score;  
    15.     }  
    16.   
    17.     @Override  
    18.     public int compareTo(Student o) {  
    19.         // TODO Auto-generated method stub  
    20.         if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部  
    21.             return -1;//由高到底排序  
    22.         else if(this.score<o.score)  
    23.             return 1;  
    24.         else{  
    25.             if(this.age>o.age)  
    26.                 return 1;//由底到高排序  
    27.             else if(this.age<o.age)  
    28.                 return -1;  
    29.             else  
    30.                 return 0;  
    31.         }  
    32.     }  
    33. }  
    34.   
    35. public class ComparableDemo01 {  
    36.   
    37.     /** 
    38.      * @param args 
    39.      */  
    40.     public static void main(String[] args) {  
    41.         // TODO Auto-generated method stub  
    42.         Student stu[]={new Student("zhangsan",20,90.0f),  
    43.                 new Student("lisi",22,90.0f),  
    44.                 new Student("wangwu",20,99.0f),  
    45.                 new Student("sunliu",22,100.0f)};  
    46.         java.util.Arrays.sort(stu);  
    47.         for(Student s:stu)  
    48.         {  
    49.             System.out.println(s);  
    50.         }  
    51.     }  
    52. }  

    在上面的程序中,实现了Comparable接口,并重写了compareTo方法,将学生先按成绩由大到小排名,成绩相同时候按照年龄由低到高排序。

     

    执行的结果是

    sunliu 22 100.0
    wangwu 20 99.0
    zhangsan 20 90.0
    lisi 22 90.0

     

    但是在设计类的时候,可能没有考虑到让类实现Comparable接口,那么就需要用到另外的一个比较器接口Comparator。

    从上面的实例我们可以发现,compareTo(T o)只有一个参数,而Comparator接口中必须要实现的compare(T o1,T o2)就有两个参数。

    代码实例

     

    [java] view plain copy
     
    1. package edu.sjtu.ist.comutil;  
    2.   
    3. import java.util.Comparator;  
    4.   
    5. class Student {  
    6.     private String name;  
    7.     private int age;  
    8.     private float score;  
    9.       
    10.     public Student(String name, int age, float score) {  
    11.         this.name = name;  
    12.         this.age = age;  
    13.         this.score = score;  
    14.     }  
    15.   
    16.     public String getName() {  
    17.         return name;  
    18.     }  
    19.     public void setName(String name) {  
    20.         this.name = name;  
    21.     }  
    22.     public int getAge() {  
    23.         return age;  
    24.     }  
    25.     public void setAge(int age) {  
    26.         this.age = age;  
    27.     }  
    28.     public float getScore() {  
    29.         return score;  
    30.     }  
    31.     public void setScore(float score) {  
    32.         this.score = score;  
    33.     }  
    34.   
    35.     public String toString()  
    36.     {  
    37.         return name+" "+age+" "+score;  
    38.     }  
    39.   
    40. }  
    41.   
    42. class StudentComparator implements Comparator<Student>{  
    43.   
    44.     @Override  
    45.     public int compare(Student o1, Student o2) {  
    46.         // TODO Auto-generated method stub  
    47.         if(o1.getScore()>o2.getScore())  
    48.             return -1;  
    49.         else if(o1.getScore()<o2.getScore())  
    50.             return 1;  
    51.         else{  
    52.             if(o1.getAge()>o2.getAge())  
    53.                 return 1;  
    54.             else if(o1.getAge()<o2.getAge())  
    55.                 return -1;  
    56.             else   
    57.                 return 0;  
    58.         }  
    59.     }  
    60.       
    61. }  
    62.   
    63.   
    64. public class ComparableDemo02 {  
    65.   
    66.     /** 
    67.      * @param args 
    68.      */  
    69.     public static void main(String[] args) {  
    70.         // TODO Auto-generated method stub  
    71.   
    72.         Student stu[]={new Student("zhangsan",20,90.0f),  
    73.                 new Student("lisi",22,90.0f),  
    74.                 new Student("wangwu",20,99.0f),  
    75.                 new Student("sunliu",22,100.0f)};  
    76.         java.util.Arrays.sort(stu,new StudentComparator());  
    77.         for(Student s:stu)  
    78.         {  
    79.             System.out.println(s);  
    80.         }  
    81.     }  
    82.   
    83. }  

    上面依然是对student对象数组进行排序,用的都是Array.sort方法,不同的是实现comparator接口时,sort方法需要传进来两个参数,即stu对象数组,以及重写的实现了comparator比较方法类。

     

    程序运行的结果和上面是一样的

     

     

    Array.sort是对数组进行排序,假如我们不想使用数组,想使用Collection接口下的集合,如想使用List,那么需要稍微做些修改:

     

     

    package comparatorTest;
     
    /**
    * 定义一个学生类
    * 包括学号,姓名,数学成绩,语文成绩
    * @author zhangnan
    *
    */
     
    public class Student{
    private String Name;
    private int ID;
    private int scoreMath;
    private int scoreChi;
    public Student (String name,int ID,int score1,int score2){
    this.Name=name;
    this.ID=ID;
    this.scoreMath=score1;
    this.scoreChi=score2;
    }
    public String getName(){
    return this.Name;
    }
    public void setName(String pname){
    this.Name=pname;
    }
    public int getID(){
    return this.ID;
    }
    public void setID(int pID){
    this.ID=pID;
    }
    public int getMathScore(){
    return scoreMath;
    }
    public void setMathScore(int score1){
    this.scoreMath=score1;
    }
    public float getChiScore(){
    return scoreChi;
    }
    public void setChiScore(int score2){
    this.scoreChi=score2;
    }
    /**
    * 返回学生信息
    */
    public String toString(){
    return Integer.toString(ID)+" "+Name+" "+Integer.toString(scoreMath)+" "+Integer.toString(scoreChi);
    }
     
     
    }
    --------------------------------------------------------------------------------
    package comparatorTest;
     
    import java.util.Comparator;
     
    public class ComparatorSort implements Comparator<Student> {
     
    public int compare(Student s1, Student s2) {
    // TODO Auto-generated method stub
    if (s1.getID() > s2.getID()) {
    return 1;
    } else if (s1.getID() < s2.getID()) {
    return -1;
    } else {
    if (s1.getMathScore() > s2.getMathScore())
    return -1;
    else if (s1.getMathScore() < s2.getMathScore())
    return 1;
    else
    return 0;
    }
     
    }
     
    }
    --------------------------------------------------------------------------------
    package comparatorTest;
     
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Random;
     
    public class test {
     
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Random random=new Random();
    ArrayList<Student> st=new ArrayList<Student>();
    Student s1= new Student("zhangnan1",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    Student s2= new Student("zhangnan2",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    Student s3= new Student("zhangnan3",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    Student s4= new Student("zhangnan4",random.nextInt(10),random.nextInt(100),random.nextInt(100));
    st.add(s1);
    st.add(s2);
    st.add(s3);
    st.add(s4);
    System.out.println("全部的学生:");
    Collections.sort(st,new ComparatorSort());
    for(Student s:st){
     
    System.out.println(s);
    }
     
    }
     
    }
     
     
     
    重写的compare方法按照随机生成的学生ID排序,其次按照数学成绩排序,生成的结果是:

    全部的学生:

    0 zhangnan3  67 78

    0 zhangnan2  39 0

    2 zhangnan1  57 96

    3 zhangnan4  62 53

    在这里我们没有使用对象数组,而是使用了Collection 接口下的ArrayList 集合,所以排序用的是Collections.sort(st,new ComparatorSort())
     
  • 相关阅读:
    【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
    【题解】【BT】【Leetcode】Binary Tree Level Order Traversal
    【题解】【BST】【Leetcode】Unique Binary Search Trees
    【题解】【矩阵】【回溯】【Leetcode】Rotate Image
    【题解】【排列组合】【素数】【Leetcode】Unique Paths
    【题解】【矩阵】【回溯】【Leetcode】Unique Paths II
    【题解】【BST】【Leetcode】Validate Binary Search Tree
    【题解】【BST】【Leetcode】Convert Sorted Array to Binary Search Tree
    第 10 章 判断用户是否登录
    第 8 章 动态管理资源结合自定义登录页面
  • 原文地址:https://www.cnblogs.com/shizhijie/p/7657049.html
Copyright © 2011-2022 走看看