首页 > 其他分享 >Comparator和Comparable

Comparator和Comparable

时间:2024-07-13 23:21:25浏览次数:5  
标签:mvp Comparable Comparator int CSer public

Comparable

  • 实现了 Comparable 接口,重写 compareTo() 方法,就可以按照自己制定的规则将由它创建的对象进行比较
public interface Comparable<T> {
    // 返回值可能为负数,零或者正数,代表的意思是该对象按照排序的规则小于、等于或者大于要比较的对象
    int compareTo(T t);
}
class CSer implements Comparable<CSer> {
    private int mvp;

    public CSer(int mvp) {
        this.mvp = mvp;
    }

    @Override
    public int compareTo(CSer o) {
        return this.mvp - o.mvp;
    }
}

Comparator

public interface Comparator<T> {
    int compare(T o1, T o2);
    // 判断该 Object 是否和 Comparator 保持一致
    boolean equals(Object obj);
    ...
}
class CSer {
    private int mvp;

    public CSer(int mvp) {
        this.mvp = mvp;
    }

    public int getMvp() {
        return mvp;
    }
}

class CSerComparator implements Comparator<CSer> {

    @Override
    public int compare(CSer o1, CSer o2) {
        return o1.getMvp() - o2.getMvp();
    }
}

public class Test {
    public static void main(String[] args) {
        CSer niko = new CSer(3);
        CSer s1mple = new CSer(5);
        CSer dev1ce = new CSer(4);

        List<CSer> list = new ArrayList<>();
        list.add(niko);
        list.add(s1mple);
        list.add(dev1ce);

        list.sort(new CSerComparator());
        for (CSer cSer : list) {
            System.out.println(cSer.getMvp());
        }
    }
}
  • ArrayList的sort源码
public void sort(Comparator<? super E> c) {
    // 保存当前队列的 modCount 值,用于检测 sort 操作是否非法
    final int expectedModCount = modCount;
    // 调用 Arrays.sort 对 elementData 数组进行排序,使用传入的比较器 c
    Arrays.sort((E[]) elementData, 0, size, c);
    // 检查操作期间 modCount 是否被修改,如果被修改则抛出并发修改异常
    if (modCount != expectedModCount) {
        throw new ConcurrentModificationException();
    }
    // 增加 modCount 值,表示队列已经被修改过
    modCount++;
}

使用选择

  • 一个类实现了 Comparable 接口,意味着该类的对象可以直接进行比较(排序),但比较(排序)的方式只有一种,很单一。

  • 一个类如果想要保持原样,又需要进行不同方式的比较(排序),就可以定制比较器(实现 Comparator 接口)。

  • 如果对象的排序需要基于自然顺序,选择 Comparable,如果需要按照对象的不同属性进行排序,选择 Comparator

标签:mvp,Comparable,Comparator,int,CSer,public
From: https://www.cnblogs.com/sprinining/p/18300958

相关文章

  • 闲说: Java 中Comparable 和 Comparator 的区别
    共同点Comparable和Comparator他们都可以实现集合的排序功能;区别Comparable被实现类实现后,需要重写compareTo方法,方可使用Collections/Arrays工具类提供的排序方法进行排序;Comparator被实现类实现后,也可以重写compare方法,这个方法虽然能返回两个对象的大小......
  • Java中Comparable接口和Comparator接口的区别(如果想知道Java中Comparable接口和Compar
        前言:在Java中,Comparable接口和Comparator接口都用于对象之间的比较和排序,但它们在使用和设计上存在一些关键的区别。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客        本篇文章主要讲解的是J......
  • JAVA Comparator 自定义排序 源码分析
    对于一个数组来说如果我们想要从大到小排序一般会这么写Integer[]nums={1,2,3};Arrays.sort(nums,newComparator<Integer>(){@Overridepublicintcompare(Integera,Integerb){returnb-a;}});......
  • 终于明白了 Array.sort(comparator) 的原理
    终于明白了Array.sort(comparator)的原理原文地址:https://www.jameskerr.blog/posts/javascript-sort-comparators/After13yearsofJavaScript,IfinallyhaveawaytorememberhowthecomparatorfunctioninArray.sort()works.使用JavaScript13年之后,我终于有......
  • Java stream sorted使用 Comparator 进行多字段排序
    摘要:介绍使用JavaStream流排序器Comparator对List集合进行多字段排序的方法,包括复杂实体对象多字段升降序混合排序方法。综述​ Java8的Stream使用了函数式编程模式,人如其名,它可以被用来对集合或数组进行链状流式的排序、过滤和统计等操作,从而让我们更方便的对集合或数组......
  • TreeMap从添加第二个元素开始,需要进行排序,原始类继承Comparable<Student>接口实现comp
    重写compareTo方法,关于o的理解@OverridepublicintcompareTo(Studento){//关于o,是红黑树中从第二个开始进入的元素,需//要和已存在的元素比较,该o是在第二个add//调用时,传入这里的Student对象。//根据题设,先用年龄排序in......
  • Go语言中的comparable接口:打通类型比较的通用之路
    在Go语言中,comparable是一个内置的接口,它代表了所有可以进行比较的类型。这包括布尔型、数值型、字符串、指针、通道以及所有元素也是可比较类型的数组、其字段全为可比较类型的结构体。这意味着,如果一个类型的值可以使用==或!=运算符进行比较,那么这个类型就实现了comparabl......
  • 面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
    写在开头面试官:“我们在Java的集合和数据结构中都离不开比较器,请你聊一聊Comparable和Comparator这两种的区别吧”内心活动:“上来就这么直接吗,那些ArrayList,HashMap都不问呀,好,既然如此,那让我来征服你吧,面试官大人!”我:“好滴!巴拉巴拉~”ComparableComparable是java.lang包......
  • compareTo、Comparator、TreeSet排序那些事
    前言:对于后端开发而言,学会对数据的自定义排序还是十分有必要的。需要用到排序的场景也是很多的,什么排行版展示、利用时间+别的条件排序、还有预接单的数据就是要展示在已接单的数据前面这种需求、等等。总之很重要的!一:对集合排序对以下的数据做展示顺序排序:未接单>预接单>已接单。(......
  • c# 类重写Equal,GetHashCode,实现IComparable,IComparable<T>
    ///<summary>///Array,List<T>排序都依赖于IComparable///</summary>publicclassStudent:IEquatable<Student>,IComparable,IComparable<Student>{publicintId{get;set;}publicstringName{get;......