类的可比较性Comparable和比较器Comparator

1. Comparable

Comparable源码如下:

public interface Comparable<T> {
    public int compareTo(T o);
}

类实现该接口意味着该类是可比较的,其方法返回值-1,0,1分别表示当前类比进行比较的类(方法参数)小、相等、大。

实现该接口意味着该类有了‘可比较’的属性

2. Comparator

Comparator部分源码如下:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);

...

    default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
    }

...
   public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {
        return Collections.reverseOrder();
   }
...

如果对没有实现Comparable接口的类进行排序,那么可以使用比较器Comparator实现。他可以选出类中一些“信息”进行比较,比如变量甚至哈希码。

如源码所示该接口是函数式接口,其唯一抽象方法是int compare(T o1,T o2),其返回值-1,0,1分别表示第一个参数比第二个参数小、相等、大。

如果对一个实现Comparator的类指定比较器进行比较的时候,比较规则与比较器对齐。示例如下:

class DemoClass implements Comparable{
    public int a;

    public DemoClass(int a) {
        this.a = a;
    }

    @Override
    public int compareTo(Object o) {
        return (a<((DemoClass)o).a)?-1:(a==((DemoClass)o).a?0:1);
    }

    @Override
    public String toString() {
        return a+"";
    }
}

public class Test2 {
    public static void main(String[] args) {
        List<DemoClass> list=new ArrayList();
        list.add(new DemoClass(3));
        list.add(new DemoClass(1));
        list.add(new DemoClass(2));

        System.out.println(list);

        //用元素自身比较属性进行排序
        Collections.sort(list);
        System.out.println(list);

        //用比较器进行排序

        Collections.sort(list,(x,y)->{//此时x和y都是list中元素类型
            return x.a<y.a?1:(x.a==y.a?0:-1);//逻辑与类定义的比较方式相反
        });

        System.out.println(list);
    }
}

output:
[3, 1, 2]
[1, 2, 3]
[3, 2, 1]

原文地址:https://www.cnblogs.com/dugk/p/9000393.html

时间: 2024-10-03 22:39:04

类的可比较性Comparable和比较器Comparator的相关文章

java中的排序Comparable接口和Comparator接口

普通的类要实现排序,必须实现Comparable接口,并重写CompareTo()方法. package test; public class Field implements Comparable<Field> {     private String name;     private int age;     public Field() {     }     public Field(String name, int age) {         this.name = name;

Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set是并列的. Collections.sort() 排序方法,实现对List对象中的元素进行排序. package com.test.collection; import java.util.ArrayList; import java.util.Collections; import java.ut

Comparable接口和Comparator接口

这两个接口经常容易混淆,不用的时候不清楚,用的时候就很容易出错,现摘抄网络上的一篇清楚的文章在此,便于日后查阅. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系. 一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接

java常用类详细介绍及总结:字符串相关类、日期时间API、比较器接口、System、Math、BigInteger与BigDecimal

一.字符串相关的类 1.String及常用方法 1.1 String的特性 String:字符串,使用一对""引起来表示. String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的. 实现了Comparable接口:表示String可以比较大小 String内部定义了final char[] value用于存储字符串数据 String:代表不可变的字符序列.简称:不可变性. 体现: 当对字符串重新赋值时,需要重写指定内存区域赋

Comparable接口与Comparator接口的比较————总结

之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都是为了进行排序.(废话,当然都是进行排序了!!!嘿嘿,大家都能看出来,不过还是写下来了!) 2. 都是接口.(额..又是废话) 除此之外,小编想不出还有什么共同点了!想到了其他的相同点可以在文章下方留言,大家一起学习! 相同点说完了,接下来就是不同点啦. Comparable接口与Comparato

Java6.0中Comparable接口与Comparator接口详解

Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者都吃饱撑着没事做吗? 再谈Comparator接口之前,大家应该先了解一个叫“策略模式”的东东.一下是百度百科对策略模式的描写: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern

Java之Comparable接口和Comparator接口

Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: 所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparable位于包java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 Strin

Comparable接口和Comparator接口的不同用法

两者都可用来在定义比较方法,然后用在排序中. Comparable是类本身继承的接口 Comparator实在类外定义一个排序的类 比较而言,觉得Comparator更灵活一些,但是Comparable方便一些. 举个栗子: import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Main { public static void main(String

comparable接口 和 comparator接口的特点与区别

1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的. 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个personList,里面包含了person1, person2, persion3....., 我们用Collections.sort( personList), 是得不到预期的结果的. 这时肯定有人要问, 那为什么可以排