Java语言入门教程(十七):Comparable与Comparator接口

    在实际开发中,我们常常需要对某些数据进行排序,这些数据往往使用数组或者集合保存。对于数组中的数据排序,API中提供了一个数组的工具类,java.util.Arrays,类中重载了大量的sort方法,可以对各种类型的数组进行排序。如对于Object类型数组排序有如下方法:

       public static void sort(Object[] a)

       假设有类Course,如下:

       package com.csst.relation;

 

public class Course {

    private String title;

    private double price;

    public Course(String title, double price) {

       super();

       this.title = title;

       this.price = price;

    }

    public Course(String title) {

       super();

       this.title = title;

    }

    public Course() {

       super();

    }

    public String getTitle() {

       return title;

    }

    public void setTitle(String title) {

       this.title = title;

    }

    public double getPrice() {

       return price;

    }

    public void setPrice(double price) {

       this.price = price;

    }

   

   

}

如果有一个Course类型的数组,需要排序,按照Arrays类的方法,仿佛只要将数组作为参数,传递给sort方法即可。但是只要我们深入考虑一下,就会发现问题。对于Course对象,所谓的顺序应该有个排序标准,比如,按照价格排,还是名称排?这个排序标准确定了,才能对多个Course对象排序。

仔细阅读Arrays.sort方法的详细描述,会发现有一个要求,即使用该方法排序的对象,必须是Comparable类型的。Comparable是一个接口,只要Course类实现这个接口即可,覆盖其中的方法:

public int compareTo(Object o)

假设,我们希望Course数组根据price排序,那么将Course类实现Comparable接口,覆盖compareTo方法:

public int compareTo(Object arg0) {

       // TODO Auto-generated method stub

       Course c=(Course)arg0;

       if(this.price>c.price){

           return 1;

       }else if(this.price>c.price){

           return -1;

       }else{

           return 0;

       }

    }

       初学者可以借助这个例子,理解一下接口的作用。接口Comparable定义了所有需要使用sort方法排序的对象的共同行为,否则sort方法根本无法实现。

       如果Course数组可能根据价格排序,也可能需要根据名称排序,显然使用这个方法就有局限性,因为compareTo方法只可能实现一种比较逻辑。Arrays类中还有另外一种排序方法:

public static void sort(Object[] a, Comparator c)

       Comparator是另一个接口,其中有一个方法:

       public int compare(Object o1, Object o2)

       只要创建一个类,实现Comparator接口,实现compare方法,就可以进行排序,如下:

package com.csst.relation;

 

import java.util.Comparator;

 

public class PriceComp implements Comparator {

 

    public int compare(Object arg0, Object arg1) {

       // TODO Auto-generated method stub

       Course c1=(Course)arg0;

       Course c2=(Course)arg1;

       if(c1.getPrice()>c2.getPrice()){

           return 1;

       }else if(c1.getPrice()<c2.getPrice()){

           return -1;

       }else{

           return 0;

       }

    }

 

}

    有了这个实现类,使用Arrays.sort(Object[] o,Comparator c)方法,即可以根据Comparator对象中的compare方法的比较算法进行排序。如果需要按照其他标准排序,只要重新写类,实现Comparator接口即可。

    通过本篇的学习,初学者不仅能掌握数组排序的方法,更能对ComparableComparator接口比较熟悉。更进一步,还是建议能借此例子,理解接口的作用。

 

       绝对原创,转载请注明出处!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值