前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈Comparable与Comparator的区别

浅谈Comparable与Comparator的区别

作者头像
陈灬大灬海
发布2022-11-28 20:30:05
3000
发布2022-11-28 20:30:05
举报

平时进行自定义排序一直使用实现Comparable接口,一段时间后操作的时候居然发现有了个Comparator接口

上网差了些资料,总结笔记一下。

基本原理就是比较,底层是二叉树

比如是3,6,5,1,7,4,9

排序的时候先放入3,之后6比3大,烦恼如3右边,5比6小,放左边,一次类推就是线面这图

首先看一下Comparable的接口定义

代码语言:javascript
复制
package java.lang;
import java.util.*;
public interface Comparable<T> {
    public int compareTo(T o);
}

Comparable对实现它的每个类的对象进行整体排序。这个接口需要类本身去实现

代码实例分析

代码语言:javascript
复制
package com.list.customsort;

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

public class TestSort {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("fd",20));
        list.add(new Person("chy",22));
        list.add(new Person("wgj",21));
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}
class Person implements Comparable<Person>{
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int compareTo(Person o) {
//        return this.getAge().compareTo(o.getAge());
        return this.getName().compareTo(o.getName());//按姓名进行正序排序。abc
    }
}

是根据person的name属性进行排序  结果:

不使用Collections.sort()方法的话,可以直接使用treeSet集合进行操作

代码语言:javascript
复制
Set<Person> set = new TreeSet<>();
        set.add(new Person("fd",20));
        set.add(new Person("chy",22));
        set.add(new Person("wgj",21));
        System.out.println(set);

结果跟上面时一模一样的也是根据name来实现了排序

为什么呢,查看treeset源码会发现走还是compareto方法

所以使用Collections.sort(list) 跟直接new TreeSet是一样的效果。

Comparator

Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

接口定义

代码语言:javascript
复制
package java.util;
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

代码实例分析

代码语言:javascript
复制
package com.list.customsort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class TestSort2 {
    public static void main(String[] args) {
        List<Person2> list = new ArrayList<>();
        list.add(new Person2("fd",20));
        list.add(new Person2("chy",22));
        list.add(new Person2("wgj",21));
        System.out.println(list);
        Collections.sort(list,new Comparator<Person2>() {
            @Override
            public int compare(Person2 o1, Person2 o2) {
                return o1.getAge().compareTo(o2.getAge());
            }
        });
        System.out.println(list);
    }
}
class Person2{
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Person2(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person2 [name=" + name + ", age=" + age + "]";
    }
}

main方法的sort方法可以使用lambda来进行简化

(public static <T> void sort(List<T> list, Comparator<? super T> c) )

代码语言:javascript
复制
Collections.sort(list,(s1,s2)-> Integer.compare(s1.getAge(),s2.getAge()));

这个时候使用treeset集合的话就没效果了。

因为它底层使用的是compareTo方法。

Comparable和Comparator区别比较

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

ok,到位!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Comparable和Comparator区别比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档