Comparable接口与Comparator接口--JAVA

一.Comparable接口 

1.1字符串类型String

调用Arrays工具类的sort()方法进行从小到大排序

 @Test
    public void text(){
        String str[]={"Jeeory","Lisa","Petter","Hanleilei"};
        Arrays.sort(str);//这里调用了Arrays工具类的sort方法,从小到大排序
        //输出排序后的结果
        for (int i=0;i<str.length;i++)
        {
            System.out.println(str[i]);
        }
        System.out.println(str[0].compareTo(str[1]));
    }

运算结果:

 在上述代码中的最后一行调用了compareTo()方法,该方法为Comparable接口的实现方法,在String类中实现了Comparable接口。当当前对象小于所传对象时,返回负数,返回0时说明相等,返回正数说明当前对象大于所传对象。对于字符串的比较,本质上是对ASCII码和Unicode码的比较。

1.2自然排序方式(Comparable)

首先定义了一个Develop类,里面有name、age成员变量。

接下来是代码部分:

 @Test
    public void text1(){
        Developer developer[]=new Developer[3];
        developer[0]=new Developer("王五",21);
        developer[1]=new Developer("李华",19);
        developer[2]=new Developer("张三",21);

        Arrays.sort(developer);

        for (int i=0;i<developer.length;i++)
        {
            System.out.println(developer[i].getName()+" "+developer[i].getAge());
        }
        System.out.println(developer[0].compareTo(developer[1]));
    }

此时利用Arrays.sort ()时出现了类型转换异常,报错信息为Develop类不能转换Comparable。原因是Develop类未实现Comparable接口。

解决方法:Develop类实现Comparable接口中的抽象方法

如:实现年龄的从小到大排序

/*
Arrays.sort方法是java中用于对数组元素进行自然排序的方法。
当调用Arrays.sort方法时,它使用数组的自然排序,这要求数组元素的类型实现了Comparable接口。
排序算法会根据compareTo方法的实现来确定元素的个数。
如果你的自定义类实现了Comparable接口,Arrays.sort方法会根据所实现的CompareTo方法来对元素排序。
默认情况下,CompareTo方法应该返回负值、零或正值,表示当前对象小于、等于或大于传入的对象。当Arrays.sort
调用compareTo方法时,它就能够根据返回值来进行排序,从小到大或者从大到小都是有可能的,具体取决于compareTo
的实现。
 */
@Override
    public int compareTo(Object o) {
        if (o==this)//判断是否为当前对象
        {
            return 0;
        }
        if (o instanceof Developer)
        {
            Developer developer=(Developer)o;
            return Integer.compare(this.age,developer.age);//返回值前加-号是相反的排列顺序
            
        }
        throw new RuntimeException("类型不匹配");

    }

程序运行结果:

 

二.Comparator接口

2.1自制排序

@Test
    public void text2(){
        Phone phone[]=new Phone[3];
        phone[0]=new Phone("HUAWEI",5999);
        phone[1]=new Phone("IPHONE",8999);
        phone[2]=new Phone("OPPO",4999);
        /*
        这里实现的是comparator的匿名接口
        compartor的优势是需要什么排序就可以直接定义,比较灵活
        自然排序可以利用comparable接口来实现,如商品排序会有一个默认的
        排序方式,用户所选择的排序方式可以利用comparator接口实现,一般会用
        匿名的实现类。
         */
        Arrays.sort(phone, new Comparator<Phone>() {
            @Override
            public int compare(Phone o1, Phone o2) {
                if (o1 instanceof Phone&&o2 instanceof Phone)
                {
                    return -Integer.compare(o1.getPrice(),o2.getPrice());
                }
                throw new RuntimeException("类型不匹配!");
            }
        });
        for (int i=0;i<phone.length;i++)
        {
            System.out.println(phone[i].getBrand()+" "+phone[i].getPrice());
        }

    }

程序运行结果:

三.个人小结

3.1comparable接口实现

在类中实现compareTo方法,因为该方法是在类中实现,参数列表只有一个对象,所以方法体中首先判断所传对象是否为本对象,接着是定义自己的排序方式,同样也是首先判断所传对象是否为该类所实现的对象。最后可以手动抛出运行时异常来处理类型不匹配的情况。

3.2comparator匿名接口实现

因为这里是采用comparator接口的匿名实现方式,所以此处的排序方式需要在Arrays.sort方法中新new 一个comparator{},此处实现的是compare方法如下图:

自然排序可以利用comparable接口来实现,如商品排序会有一个默认的 排序方式,用户所选择的排序方式可以利用comparator接口实现,一般会用 匿名的实现类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值