资讯专栏INFORMATION COLUMN

Java Comparator与Comparable辨析

wenhai.he / 1749人阅读

摘要:与辨析声明文章均为本人技术笔记,转载请注明出处比较三种状态根据需求定义序升序降序返回负数,表示比较两元素满足序,无须调整,返回,表示比较两元素相等,无须调整位置,返回正数,表示比较两元素不满足序,按序调整位置对象内部排序源码继承接口的对象必

Comparator与Comparable辨析 声明

文章均为本人技术笔记,转载请注明出处:
[1] https://segmentfault.com/u/yzwall
[2] blog.csdn.net/j_dark/

比较三种状态

根据需求定义“序”(升序 or 降序);

LESS_THAN: 返回负数,表示比较两元素满足序,无须调整,;

EQUAL:返回0,表示比较两元素“相等”,无须调整位置,;

GREATER_THAN:返回正数,表示比较两元素不满足序,按序调整位置;

对象内部排序:Comparable Comparable源码
// full name: java.lang.Comparable
public interface Comparable {
    public int compareTo(T o);
}

继承Comparable接口的对象必须重写compareTo方法,实现对象内部排序
目前所有的包装类和String类都实现了Comparable接口;

Comparable实现示例
class Student implements Comparable{
    private static final int LESS_THAN =  -1;
    private static final int EQUAL =  0;
    private static final int GREATER_THAN =  1;
    int age;
    int id;
    
    ...
    @Override
    // 按照age升序排练,age相等按照id降序排练
    public int compareTo(Student o) {
        if (this.age < o.age) {
            return LESS_THAN;
        } 
        if (this.age ==  o.age) {
            return this.id > o.id ? LESS_THAN : (this.id == o.id) ? EQUAL : GREATER_THAN;
        } else {
            return GREATER_THAN;
        }
    }
    ...
}
根据Comparable排序

集合或数组元素实现Comparable接口,通过以下两种方式实现排序:
集合排序Collections.sort(List list),底层调用Arrays.sort()实现;
数组排序Arrays.sort(T[] arr)

对象外部排序:Comparator Comparator源码
public interface Comparator {
    ...
    // 重写compare比较规则,通过外部传入实现自定义排序
    int compare(T o1, T o2);
}
Comparator实现示例
/**
 * 集合排序:Colletions.sort(list, new MyComparator());
 * 数组排序:Arrays.sort(arr, new MyComparator());
 */
class MyComparator implements Comparator {
    private static final int LESS_THAN =  -1;
    private static final int EQUAL =  0;
    private static final int GREATER_THAN =  1;
    
    @Override
    // 按照age降序排练,age相等按照id升序排练
    public int compare(Student a, Student b) {
        if (a.age > b.age) {
            return LESS_THAN;
        } 
        if (a.age ==  b.age) {
            return a.id < b.id ? LESS_THAN : (a.id == b.id) ? EQUAL : GREATER_THAN;
        } else {
            return GREATER_THAN;
        }
    }
}
根据Comparator排序

Comparator体现了策略设计模式,即不改变对象自身,而使用一个策略对象去改变它的行为。

集合或数组元素实现Comparator接口,通过以下两种方式实现排序:
集合排序:Collections.sort(List list, new Comparator),底层调用Arrays.sort(T[] arr, Comparator c)实现;
数组排序:Arrays.sort(T[] arr, Comparator c)

Comparator与Comparable辨析

ComparableComparator都是用于对集合或数组元素的排序比较,

Comparable面向对象,对象重写compareTo方法即可在内部完成比较,更改比较逻辑时只能更改对象自身(比如通过Comparable接口无法改变包装类型和String类型的比较规则);

Comparator面向集合/数组,在外部自定义比较器实现接口,传入集合/数组内部提供比较,更改比较逻辑时只需更改自定义比较器,无须更改对象,应用更广泛

参考

[1] http://blog.csdn.net/mageshuai/article/details/3849143

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67000.html

相关文章

  • Java Comparable vs Comparator

    摘要:和方法可以对数组进行排序,但是这种方法排序要求对象所在的类必须实现接口,此接口用于指定排序规则如果一个类已经开发完成,但是在此类建立的初期并没有实现接口,此时肯定是无法进行对象排序操作的,所以为了解决这个问题,定义了另一个比较器的操 Collections.sort() 和 Arrays.sort()方法可以对Object数组进行排序,但是这种方法排序要求对象所在的类必须实现Compa...

    KitorinZero 评论0 收藏0
  • java comparablecomparator

    摘要:一内部排序接口实现该接口的类,支持自然排序内排序。方法与方法不一致。在有序集合看来和是相等的,因此第个键无法被添加到集合中。 一、Comparable(内部排序接口) 实现该接口的类,支持自然排序(内排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求对象必须实现Comparable接口 文档中指出: 如果该对象大于指定对象,返回...

    why_rookie 评论0 收藏0
  • Java™ 教程(对象排序)

    对象排序 List l可以如下排序。 Collections.sort(l); 如果List包含String元素,它将按字母顺序排序,如果它由Date元素组成,它将按时间顺序排序,这是怎么发生的?String和Date都实现了Comparable接口,Comparable实现为类提供了自然的顺序,允许该类的对象自动排序,下表总结了一些实现Comparable的更重要的Java平台类。 类 自然...

    Chao 评论0 收藏0
  • Comparable and Comparator

    摘要:中的一切类都是继承于,在中实现了函数所以,其它所有的类也相当于都实现了该函数。是比较和的大小。返回负数,意味着比小返回零,意味着等于返回正数,意味着大于。 Comparable Comparable 是排序接口。 Collection.sort() 和Arrays.sort()都支持可以排序实现Comparable接口的类的对象的List列表(或数组) 换而言之, 如果数组或列表想支持...

    Barrior 评论0 收藏0
  • 如何理解java里的ComparatorComparable

    摘要:,又名比较器,是为了比较两个对象的大小而抽象出的一个接口。在排序的时候常需要实现这个接口来定制比较规则。若函数的返回值大于,那么在排序后会将放在的后面。 Comparator,又名比较器,是为了比较两个对象的大小而抽象出的一个接口。在排序的时候常需要实现这个接口来定制比较规则。 但是很多人用的时候不清楚该如何使用这个接口,下面我就讲一下这个接口的正确使用方法!这个接口里有一个必须实现的...

    sydMobile 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<