Java比较器

Comparable

自然排序

Comparable接口排序方式称为 自然排序。实现Comparable接口的类必须实现compareTo()方法:

public class CompareTest implements Comparable<T>{
    @Override
    public int compareTo(T t){}
}

a.compareTo(b)返回1,系统认为a>ba.compareTo(b)返回-1,系统认为a<ba.compareTo(b)返回0,系统认为a=b。可以改变重写内容使得系统认为a>b,而实际上b>a

数组的自然排序

 使用Arrays.sort()方法可实现数组的自然排序。

public static void sort(Object[] a) {}

 对于自然排序方法,sort()按照 系统认为的 从小到大 进行排序,即compareTo()返回-1的排在之前compareTo()返回1的排在之后compareTo()返回0则按照其它规则排序。

Person.java

public class Person implements Comparable<Person> {
    private String name;
    private float height;
    private int weight;
    public Person(String name,float height,int weight){
        this.name = name;
        this.height = height;
        this.weight = weight;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    
    public void setHeight(float height){
        this.height = height;
    }
    public float getHeight(){
        return this.height;
    }
    
    public void setWeight(int weight){
        this.weight = weight;
    }
    public int getWeight(){
        return this.weight;
    }
    
    @Override
    public int compareTo(Person person){
        if(this.getHeight() > person.getHeight()) return 1;
        else if(this.getHeight() < person.getHeight()) return -1;
        else {
            if(this.getWeight() > person.getWeight()) return 1;
            else if(this.getWeight() < person.getWeight()) return -1;
            else return this.getName().compareTo(person.getName());
        }
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Person[] persons = new Person[5];
        persons[0] = new Person("Tony",1.75f,130);
        persons[1] = new Person("Anna",1.70f,120);
        persons[2] = new Person("Steve",1.75f,120);
        persons[3] = new Person("Jerry",1.74f,115);
        persons[4] = new Person("Lucy",1.70f,120);
        
        Arrays.sort(persons);
        for(Person person : persons) {
            System.out.println(person.getName()+" "
                               +person.getHeight()+"m "
                               +person.getWeight()+"(1/2Kg)");
        }
    }
}

运行结果:

Anna 1.7m 120(1/2Kg)
Lucy 1.7m 120(1/2Kg)
Jerry 1.74m 115(1/2Kg)
Steve 1.75m 120(1/2Kg)
Tony 1.75m 130(1/2Kg)

Comparator

定制排序

Comparator接口排序方式称为 定制排序。实现Comparator的类必须实现compare()方法:

public class CompareTest implements Comparator<T> {
    @Override
    public int compare(T t1,T t2) {}
}

ComparatorComparable的区别在于:
 使用Comparable接口实现排序依赖于需要排序的类,排序的规则(从大到小还是从小到大)在需要排序的类内部制定。因此实现Comparable接口的类一旦制定排序规则(从大到小还是从小到大)在使用中就不能改变。
 使用Comparator接口实现排序不依赖于需要排序的类,排序的规则(从大到小还是从小到大)可以在需要排序的类外部制定。因此对于Comparator接口排序方式,常使用匿名内部类实现。

Arrays.sort(persons,new Comparator<Person>(){
    @Override
    public int compare(Person p1,Person p2) {}
});

compare()返回1系统认为p1>p2compare()返回-1系统认为p1<p2compare()返回0系统认为p1=p2sort()方法按照 系统认为从小到大 进行排序,即compare()返回-1的排在之前compare()返回1的排在之后compare()返回0则按照其它规则排序。

数组的定制排序

Person.java

public class Person {
    private String name;
    private float height;
    private int weight;
    public Person(String name,float height,int weight){
        this.name = name;
        this.height = height;
        this.weight = weight;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    
    public void setHeight(float height){
        this.height = height;
    }
    public float getHeight(){
        return this.height;
    }
    
    public void setWeight(int weight){
        this.weight = weight;
    }
    public int getWeight(){
        return this.weight;
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Person[] persons = new Person[5];
        persons[0] = new Person("Tony",1.75f,130);
        persons[1] = new Person("Anna",1.70f,120);
        persons[2] = new Person("Steve",1.75f,120);
        persons[3] = new Person("Jerry",1.74f,115);
        persons[4] = new Person("Lucy",1.70f,120);
        
        //从小到大排序
        Arrays.sort(persons,new Comparator<Person>(){
            @Override
            public int compare(Person p1,Person p2){
                if(p1.getHeight() > p2.getHeight()) return 1;
                else if(p1.getHeight() < p2.getHeight()) return -1;
                else {
                    if(p1.getWeight() > p2.getWeight()) return 1;
                    else if(p1.getWeight() < p2.getWeight()) return -1;
                    else return p1.getName().compareTo(p2.getName());
                }
            }
        });
        for(Person person : persons) {
            System.out.println(person.getName()+" "
                               +person.getHeight()+"m "
                               +person.getWeight()+"(1/2Kg)");
        }
        
        System.out.println();
        
        //从大到小排序
        Arrays.sort(persons,new Comparator<Person>(){
            @Override
            public int compare(Person p1,Person p2){
                if(p1.getHeight() > p2.getHeight()) return -1;
                else if(p1.getHeight() < p2.getHeight()) return 1;
                else {
                    if(p1.getWeight() > p2.getWeight()) return -1;
                    else if(p1.getWeight() < p2.getWeight()) return 1;
                    else return -(p1.getName().compareTo(p2.getName()));
                }
            }
        });
        for(Person person : persons) {
            System.out.println(person.getName()+" "
                               +person.getHeight()+"m "
                               +person.getWeight()+"(1/2Kg)");
        }
        
    }
}

运行结果:

Anna 1.7m 120(1/2Kg)
Lucy 1.7m 120(1/2Kg)
Jerry 1.74m 115(1/2Kg)
Steve 1.75m 120(1/2Kg)
Tony 1.75m 130(1/2Kg)

Tony 1.75m 130(1/2Kg)
Steve 1.75m 120(1/2Kg)
Jerry 1.74m 115(1/2Kg)
Lucy 1.7m 120(1/2Kg)
Anna 1.7m 120(1/2Kg)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值