[java]compareable 内部排序器和 comparetor 外部排序器

一、使用方法
(1)目标对象(省略get、set、toString方法):

public class Person implements Comparable<Person> {
    private String name;
    private Integer age;
    private Integer height;

    public Person(String name, Integer age, Integer height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

	//按照 年龄 、身高 、姓名从小到大排序
    @Override
    public int compareTo(Person o) {
        int s = this.age.compareTo(o.age);
        if(s != 0){
            return s;
        }
        s = this.height.compareTo(o.height);
        if(s != 0){
            return s;
        }
        boolean equals = this.name.equals(o.name);
        if(equals){
            return 0;
        }

        return -1;
    }
}    

(2)测试类:


import java.util.*;

public class Client {
    public static void main(String[] args) {
        Person person = new Person("b", 19, 175);
        Person person1 = new Person("z", 35, 180);
        Person person2 = new Person("a",20,177);
        Person person3 = new Person("k", 35, 181);
        Person person4 = new Person("s",20,177);
        Person person5 = new Person("s",20,177);

        ArrayList<Person> objects = new ArrayList<>();
        objects.add(person);
        objects.add(person1);
        objects.add(person2);
        objects.add(person3);
        objects.add(person4);
        objects.add(person5);

        Collections.sort(objects);


        for (int i=0;i<objects.size();i++){
            System.out.println("List集合使用for循环遍历");
            System.out.println(objects.get(i));
        }

        System.out.println("使用iterator遍历List");
        Iterator<Person> iterator = objects.iterator();
        while(iterator.hasNext()){
            Person next = iterator.next();
            System.out.println(next);
        }

//=====================Compareator=====================				
	//按照身高从大到小排序
        Collections.sort(objects, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1.getHeight()>o2.getHeight()){
                return -1;
            }else if(o1.getHeight() < o2.getHeight()){
                return 1;
                }
                return 0;
            }
        });
        System.out.println("采用自定义排序器Compareator,根据身高排序");
        for (Person p:objects) {
            System.out.println(p);
        }

    }
}

二、二者有何不同

compareable接口:

集合中需要排序的对象必须实现Compareable接口,重写compareTo(Object o)方法,拿当前对象和o进行比较大小(大返回1,相等返回0,小返回-1),得修改目标类Person
使用:
void sort(List list)

compareator接口:

集合中需要排序的对象无必需实现Compareator接口,可在外部重写compare(Object o1,Object o2)方法,拿o1和o2进行比较大小(大返回1,相等返回0,小返回-1), 不用修改目标类Person
使用:
void sort(List list, Comparator<? super T> c)

Collections.sort(objects, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1.getHeight()>o2.getHeight()){
                return -1;
            }else if(o1.getHeight() < o2.getHeight()){
                return 1;
                }
                return 0;
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值