Comparable和Comparator

一、Comparable比较类:

1.为什么需要这个类:

java中的对象,正常情况下,只能进行比较:== 或 !=,不能使用<、>来进行比较。但是在实际开发中,又需要对多个对象进行排序,言外之意,就需要比较对象的大小。所以就要通过两个定义的接口之一来实现:Comparable或Comparator

2.Coparable接口的使用:

①像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象的方式。

②像String、包装类重写了compareTo()方法后。进行了从小到大的排列。

③重写compareTo(obj)的规则:

  • 如果当前对象this大于形参对象obj,则返回正整数。
  • 如果当前对象this小于形参对象obj,则返回负整数。
  • 如果当前对象this等于形参对象obj,则返回零。

代码如下:

public class Comeper {
    @Test
    public void tests(){
        String[] arr = new  String[]{"AA","BB","CC","GG","DD"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }//结果就是AA,BB,CC,DD,GG

 

④对于自定义类来说,如果需要排序,可以让自定义类实现Comparable接口,重写ComparaTo()。

代码如下:

    @Override
    public int compareTo(Object o) {//按照价格排序重写
        if (o instanceof Plan){
            Plan gg = (Plan)o;
            if (this.price > gg.price){
                return 1;
            }else if (this.price < gg.price){
                return -1;
            }else {
                return 0;
            }

        }
        throw new RuntimeException("传的什么值,不能比!");
    }

//toString重写省略
@Test
    public void teste(){
    Plan[] miaosha = new Plan[4];
    miaosha[0] = new Plan("dell",2500);
    miaosha[1] = new Plan("hesisi",3600);
    miaosha[2] = new Plan("motelola",200);
    miaosha[3] = new Plan("apple",8000);
    Arrays.sort(miaosha);
        System.out.println(Arrays.toString(miaosha));
    }

 

 

二、Comparator接口的使用:定制排序

适用场景:当元素的类型没有实现java.lang.Comparable接口又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序。

 @Test
    public void teset(){
        String[] arr = new  String[]{"AA","BB","CC","GG","DD"};
        Arrays.sort(arr, new Comparator() {//匿名实现类对象
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof String && o2 instanceof String){
                    String ww = (String)o1;
                    String ss = (String)o2;
                    return -ww.compareTo(ss);
                }
                throw  new RuntimeException("类型错误!");
            }
        });
        System.out.println(Arrays.toString(arr));
    }

 

三、Comparable接口和Comparator的使用比较对比:

Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小

Comparator接口属于临时性的比较

posted @ 2019-05-12 22:09  黑暗之魂DarkSouls  阅读(131)  评论(0编辑  收藏  举报