关于Comparator接口和Comparable接口的对比(实例展示)

我们首先来看看API上是如何解释的:

  • Comparable接口

该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。 实现该接口的对象,可以使用如在键sorted map或作为在元件sorted set ,而不需要指定一个comparator 。

int compareTo(T o)将此对象与指定的对象进行比较以进行排序。 返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。

  • Comparator接口

比较功能,对一些对象的集合施加了一个整体排序 。 可以将比较器传递给排序方法(如Collections.sort或Arrays.sort ),以便对排序顺序进行精确控制。与Comparable不同,比较器可以可选地允许比较空参数,同时保持对等价关系的要求。

  • 来看具体实例
package HomeWork0411;

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

//实现Comparable接口,重写compareTo( )方法
class SortDemo implements Comparable<SortDemo>
{
    //首先封装两个属性
    private int age;
    private String name;
    
    public SortDemo(int age, String name)
    {
        super();
        this.age = age;
        this.name = name;
    }

    public SortDemo()
    {
        super();
        // TODO Auto-generated constructor stub
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public String getName()
    {
        return name;
    }

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

     //按照年龄升序排列(也可以进行降序排列 )
    @Override 
    public int compareTo(SortDemo o)
    {
        // TODO Auto-generated method stub
        return  age - o.getAge();
    }
    
    /*
     *  Comparable接口中实现compareTo方法。jdk中的默认排序都是通过判断此接口实现,通过该接口的compareTo方法返回值比较大小排序。
     *  如Collections.Sort,及TreeMap中的排序都是默认通过compareTo的返回值进行排序。
     *  Comparable被称为内比较器。
     *  compareTo方法的返回值是int,有三种情况: 
     *  1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数 
     *  2、比较者等于被比较者,那么返回0 
     *  3、比较者小于被比较者,那么返回负整数
     */
}

public class ComparableDemo
{
    /**
     * 实现升序和降序是因为比较者和被比较者的前后关系决定的
     * 实在闹不明白,那就可以把两种前后关系试着来一遍输出  看结果是否需要调整
     */
    public static void main(String[] args)
    {
         //创建一个ArrayList集合用来存放信息
         List<SortDemo> demo = new ArrayList<SortDemo>( );
         demo.add(new SortDemo(23,"adf"));
         demo.add(new SortDemo(24,"adf"));
         demo.add(new SortDemo(32,"adf"));
         demo.add(new SortDemo(25,"adf"));
         demo.add(new SortDemo(83,"adf"));
         demo.add(new SortDemo(63,"adf"));
         demo.add(new SortDemo(90,"adf"));
         demo.add(new SortDemo(23,"adf"));
         demo.add(new SortDemo(23,"adf"));
         
         System.out.println("未排序=======");
         printList(demo.iterator());
         
         //实现comparable 自排序  内部排序
         System.out.println("实现comparable 自排序  内部排序:");
         Collections.sort(demo);
         printList(demo.iterator());
         
         //实现comparator外部排序
         Comparator<SortDemo> camtor = new Comparator<SortDemo>()
         {
             /*
              *  Comparator接口有一个compare方法,若想通过Comparator接口排序, 则必须实现该
              * 类的compare方法,排序的时候,通过该方法的返回值进行排序。 利用Comparator接
              * 口排序,不需要待排序的类实现该接口,而是定义一个全新的 比较器类进行比较(具
              * 体比较规则,由用户根据具体场景定义)。
              *  Comparator常被称为外比较器。 
              * compare方法返回值和Comparable接口一样是int,有三种情况: 
              *  1、o1大于o2,返回正整数 
              *  2、o1等于o2,返回0 
              *  3、o1小于o2,返回负整数
              */

            @Override//按照年龄降序排列
            public int compare(SortDemo o1, SortDemo o2)
            {
                // TODO Auto-generated method stub
                return o2.getAge() - o1.getAge();
            }
         
         };//注意这里有个分号,因为内部是对外比较器的compare()方法的重写
         
         System.out.println("实现comparator 外部排序:");
         Collections.sort(demo,camtor);
         printList(demo.iterator());
    }

    //用於遍历输出的方法   (又学到一招 )
    public  static void printList(Iterator<SortDemo> iterator)
    {
        while (iterator.hasNext())
        {
            SortDemo ad = iterator.next();
            System.out.println("Age:" + ad.getAge() + "\t" + "Name:" + ad.getName());
        }
        System.out.println("=====================");
    }

}

最终的输出结果是:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值