集合排序Comparator和Comparable

Posted 做个机灵鬼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合排序Comparator和Comparable相关的知识,希望对你有一定的参考价值。

1.Comparator

理论整理:
1.Comparator接口位于java.util包下
2.要在比较类外部实现接口
3.在调用sort()方法时,要指定Comparator的实现类,比如我们Cat类进行比较,那么这里就是两个要比较的Cat类的对象,所以可以有一个单独的类实现Comparator
代码实现

比较类

public class Cat {
        private String name;//名字
        private int month;//年龄
        private String specise;//品种

        //构造方法
        public Cat(String name, int month, String specise) {
            this.name = name;
            this.month = month;
            this.specise = specise;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getMonth() {
            return month;
        }

        public void setMonth(int month) {
            this.month = month;
        }

        public String getSpecise() {
            return specise;
        }

        public void setSpecise(String specise) {
            this.specise = specise;
        }

        @Override
        public String toString() {
            return "Cat{" +
                    "名字='" + name + '\\'' +
                    ", 年龄=" + month +
                    ", 品种='" + specise + '\\'' +
                    '}';
        }
}

接口类,这里有两个接口,按两种属性进行排序

import java.util.Comparator;
//按名字字母升序排序
//这里需要注意,接口后面需加上泛型
public class NameComparator implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        String Name1 = o1.getName();
        String Name2 = o2.getName();
        //先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至得到最终结果或者其
        //Name1>Name2返回正整数,相等时返回0,<时返回负整数
        int n =Name1.compareTo(Name2);
        return n;
    }
}
import java.util.Comparator;

public class AgeComparator implements Comparator<Cat> {
    //按年龄降序排序
    @Override
    public int compare(Cat o1, Cat o2) {
        int age1 = o1.getMonth();
        int age2 = o2.getMonth();
        return age2-age1;
    }
}

测试类

import java.util.*;

public class CompartorText {
    public static void main(String[] args) {
        //创建三个猫对象
        Cat huahua = new Cat("aomi",5,"英国短毛猫");
        Cat aryary = new Cat("aimi",6,"三花猫");
        Cat wang = new Cat("aiai",3,"蓝猫");
        List<Cat> list = new ArrayList<Cat>();
        list.add(huahua);
        list.add(aryary);
        list.add(wang);
        System.out.println("未排序的顺序:");
        for(Cat n:list){
            System.out.println(n);
        }
        System.out.println("***********");
        System.out.println("按名字升序排序后的顺序为");
        //指定Comparator的实现类,按名字排序的类
        Collections.sort(list,new NameComparator());
        for(Cat n:list){
            System.out.println(n);
        }
        System.out.println("**********");
        System.out.println("按年龄降序排序");
        Collections.sort(list,new AgeComparator());
        for(Cat n:list){
            System.out.println(n);
        }
    }
}

2.Comparable

理论整理
1.位于java.lang包
2.要在比较类上实现该接口
3.调用sort方法只需指定集合名即可

代码实例

比较类

//比较类
public class Goods implements Comparable<Goods> {
    private String id;
    private String name;
    private double price;
    //构造方法
    public Goods(String id,String name ,double price){
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "商品编号:"+id+",商品名字:"+name+",商品价格:"+price;
    }
    //比较中实现该接口
    @Override
    public int compareTo(Goods o) {
        //按商品价格降序排序
        double price1 = this.price;
        double price2 = o.price;
        int n =new Double(price2-price1).intValue();
        return n;
    }
}

测试类

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

//按商品价格降序排序
public class GoodsText {
    public static void main(String[] args) {
        //创建商品对象
        Goods goods1 = new Goods("sooo1","冰箱",3000);
        Goods goods2 = new Goods("sooo2","电视",7000);
        Goods goods3 = new Goods("sooo3","电脑",4000);
        List list = new ArrayList();
        list.add(goods1);
        list.add(goods2);
        list.add(goods3);
        System.out.println("未排序前的顺序为:");
        Iterator<Goods> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("排序后的顺序为:");

        Collections.sort(list);
        it= list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

    }
}

于应用场景
一般情况下如果对某个类进行排序,比如Cat类,如果使用Comparable接口的方式,那么Cat类需要实现Comparable接口。
如果Cat类通过Comparable接口的方式实现排序,比如通过name排序了。那么我们还希望通过age进行排序,这时不希望修改Cat类,那此时就需要使Comparator接口了
因此,Comparable接口可以作为实现类的默认排序算法,Comparator接口则用于一个类的扩展排序

以上是关于集合排序Comparator和Comparable的主要内容,如果未能解决你的问题,请参考以下文章

Comparable和Comparator的差别

Comparable和Comparator的差别

Comparable和Comparator

集合排序Comparator和Comparable

Comparable与Comparator

Comparable与Comparator的区别