集合排序Comparable和Comparator有什么区别?

栏目: IT技术 · 发布时间: 4年前

内容简介:Comparable和Comparator兄弟俩长得是真像。但是,需要注意下,使用中它们还是有不少区别的。下面,就一探究竟吧。一、Comparator做过集合排序的童鞋应该知道,可以使用Collections.sort方法对集合进行排序。我们点进去Collections类源码里边,会发现sort有两个重载方法。一个只需传一个List参数,另一个需要传两个参数:List和Comparator。

Comparable和Comparator兄弟俩长得是真像。但是,需要注意下,使用中它们还是有不少区别的。下面,就一探究竟吧。

一、Comparator

做过集合 排序 的童鞋应该知道,可以使用Collections.sort方法对集合进行排序。我们点进去Collections类源码里边,会发现sort有两个重载方法。一个只需传一个List参数,另一个需要传两个参数:List和Comparator。

其实,这两种方法就对应了Comparable和Comparator的两种用法。我经常使用带两个参数的方法,即需要实现Comparator接口。

使用步骤:

  1. 定义待比较的实体类。
  2. 定义一个比较器,实现Comparator接口。
  3. 重写compare方法。
//待比较的实体类
public class User{
    private int age;
    private String name;

    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;
    }

    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public User() {

    }
}
//比较器,实现Comparator接口
public class UserCompare implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        return o1.getAge() - o2.getAge();
    }
}

public class CmpTest {
    public static void main(String[] args) {

        User user1 = new User(20, "李四");
        User user2 = new User(18, "张三");
        User user3 = new User(23, "王五");

        ArrayList<User> userList = new ArrayList<>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);

        System.out.println("排序前");
        for (User user : userList) {
            System.out.println(user.getAge()+":"+user.getName());
        }
        Collections.sort(userList, new UserCompare()); //把比较器传进去
        System.out.println("排序后");
        for (User user : userList) {
            System.out.println(user.getAge()+":"+user.getName());
        }
    }
}

打印结果如下:

排序前
20:李四
18:张三
23:王五
排序后
18:张三
20:李四
23:王五

可以看到,已经实现了集合中User对象按年龄升序排序。

二、Comparable

这种方式,需要修改User类,实现Comparable接口,然后重写compareTo方法。

public class User implements Comparable<User>{
    private int age;
    private String name;

    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;
    }

    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public User() {

    }

    @Override
    public int compareTo(User o) {
        return this.getAge() - o.getAge();
    }
}

测试类中只需要修改一行代码

//原来的代码
Collections.sort(userList, new UserCompare()); 
//替换为
Collections.sort(userList);

测试结果和上面是一模一样的。

三、总结

  1. 它们出自不同的包,Comparator在 java.util 包下,Comparable在 java.lang 包下。
  2. Comparator 使用比较灵活,不需要修改实体类源码,但是需要实现一个比较器。
  3. Comparable 使用简单,但是对代码有侵入性,需要修改实体类源码。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

统计自然语言处理

统计自然语言处理

宗成庆 / 清华大学出版社 / 2008-5 / 66.00元

内容简介 本书全面介绍了统计自然语言处理的基本概念、理论方法和最新研究进展,内容包括形式语言与自动机及其在自然语言处理中的应用、语言模型、隐马尔可夫模型、语料库技术、汉语自动分词与词性标注、句法分析、词义消歧、统计机器翻译、语音翻译、文本分类、信息检索与问答系统、自动文摘和信息抽取、口语信息处理与人机对话系统等,既有对基础知识和理论模型的介绍,也有对相关问题的研究背景、实现方法和技术现状的详......一起来看看 《统计自然语言处理》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具