2.3 comparator(比较器)

1.comparator是java的一种机制,用来帮助我们给相同对象的不同属性排序

2.Comparable接口,是一个对象本身就已经支持自比较所需要实现的接口,如String,Integer自己就已经实现了Comparable接口,可以完成比较大小的操作,在sort时,如果不指定Comparator就以自然顺序排序,即实现Comparable接口设定的排序方式

3.Comparator是一个专用的比较器,当对象不支持自比较或者自比较函数必能满足要求时,可以通过写一个比较器来完成两个对象之间的大小的比较。

比如java.util.Arrays下就有按照自然排序的Arrays.sort(a)和按照自定义排序的Arrays.sort(a,cmp)cmp指Comparator

4.举例,对Student对象的不同属性排序

package com.cx.sort;

import java.util.Comparator;

public class Student {
    private String name;
    private int id;
    public static final Comparator<Student> By_NAME=new ByName();
    public static final Comparator<Student> By_ID=new ById();
    
    public String getName() {
        return name;
    }
    public int getId() {
        return id;
    }
    public Student(String name,int id) {
        this.name=name;
        this.id=id;
    }
    //按照名字排序
    private static class ByName implements Comparator<Student>{
        public int compare(Student v, Student w) {
            return v.name.compareTo(w.name);
        }
    }
    //按照id排序
    private static class ById implements Comparator<Student> {
        public int compare(Student v, Student w) {
            return v.id-w.id;
        }        
    }
}

 

package com.cx.sort;

import java.util.Comparator;

public class Test {
    public static void sort(Object[] a,Comparator comparator) {
        //插入排序
        int N=a.length;
        for(int i=1;i<N;i++) {
            for(int j=i;j>0 && less(comparator,a[j],a[j-1]);j--) {
                exch(a,j,j-1);
            }
        }
    }
    private static boolean less(Comparator c,Object v,Object w) {
        //Comparator里的方法是compare()
        //Comparable里的方法是compareTo()
        return c.compare(v, w)<0;
    }
    private static void exch(Object[] a,int i,int j) {
        Object swap=a[i]; a[i]=a[j];  a[j]=swap;
    }
    
    private static void show(Student[] a) {
        for(int i=0;i<a.length;i++) {
            System.out.println("姓名:"+a[i].getName()+" "+"编号:"+a[i].getId());
        }
    }
    
    public static void main(String[] args) {
        Student a=new Student("a", 5);
        Student b=new Student("b", 1);
        Student[] stu= {a,b}; 
        System.out.println("按照编号排序");
        sort(stu, Student.By_ID);
        show(stu);
        System.out.println("按照姓名排序:");
        sort(stu,Student.By_NAME);
        show(stu);        
    }

}

结果:

按照编号排序
姓名:b 编号:1
姓名:a 编号:5
按照姓名排序:
姓名:a 编号:5
姓名:b 编号:1

 

posted on 2018-01-01 15:28  SunnyCx  阅读(347)  评论(0编辑  收藏  举报

导航