博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
List集合排序Comparable与Comparator实现
阅读量:2167 次
发布时间:2019-05-01

本文共 4127 字,大约阅读时间需要 13 分钟。

List集合排序Comparable与Comparator实现

前言

Comparable和 Comparator有什么区别?相信很多同学在面试过程中会经常遇到这个问题。今天我们就结合实际应用来分析这两个对象的区别。

需求

我们的集合里存放了一批砖石王老五的资料,我们需要对这个集合进行排序,排序的规则就按照年少多金来进行排序。什么是年少多金?也就是说我们先比较年龄,年龄小的排在前面,年龄大的排在后面,年龄相同的,千多的排在前面。

Comparable 实现

使用Comparable 排序的需要实现Comparable 接口中的compareTo方法,在User中我们先

@Datapublic class User implements Comparable
{
/** * 名字 */ private String name; /** * 年龄 */ private int age; /** * 金钱 */ private int money; public User(){
} public User(String name,int age,int money){
this.name=name; this.age=age; this.money=money; } @Override public int compareTo(User user) {
//先根据用户年龄升序排序 int tmp=this.getAge()-user.getAge(); if(tmp==0){
//如果年纪相等,那么在比较钱多钱少, return user.getMoney()-this.getMoney(); } return tmp; }}
public static void main(String[] args){
List
list=new ArrayList<>(); list.add(new User("Aom",38,999999)); list.add(new User("Bom",28,999999)); list.add(new User("Com",18,999999)); list.add(new User("Dom",38,888888)); list.add(new User("Gom",20,666666)); list.add(new User("Eom",28,888888)); list.add(new User("Fom",18,888888)); System.out.println("排序前"); list.forEach(x->System.out.println(x)); Collections.sort(list); System.out.println("排序后"); list.forEach(x->System.out.println(x)); }

执行main方法输出结果如下所示,集合输出的结果是按照年少多金排序的。可见通过Comparable 实现是可实现我们的排序需求的。

排序前

User(name=Aom, age=38, money=999999)
User(name=Bom, age=28, money=999999)
User(name=Com, age=18, money=999999)
User(name=Dom, age=38, money=888888)
User(name=Gom, age=20, money=666666)
User(name=Eom, age=28, money=888888)
User(name=Fom, age=18, money=888888)
排序后
User(name=Com, age=18, money=999999)
User(name=Fom, age=18, money=888888)
User(name=Gom, age=20, money=666666)
User(name=Bom, age=28, money=999999)
User(name=Eom, age=28, money=888888)
User(name=Aom, age=38, money=999999)
User(name=Dom, age=38, money=888888)

Comparator 实现

Comparator 实现方式则不需要对比较的对象进行修改,经排序的逻辑放在外层。

@Datapublic class User {
/** * 名字 */ private String name; /** * 年龄 */ private int age; /** * 金钱 */ private int money; public User(){
} public User(String name,int age,int money){
this.name=name; this.age=age; this.money=money; }}

排序方法实现

public static void main(String[] args){
List
list=new ArrayList<>(); list.add(new User("Aom",38,999999)); list.add(new User("Bom",28,999999)); list.add(new User("Com",18,999999)); list.add(new User("Dom",38,888888)); list.add(new User("Gom",20,666666)); list.add(new User("Eom",28,888888)); list.add(new User("Fom",18,888888)); System.out.println("排序前"); list.forEach(x->System.out.println(x)); Collections.sort(list, new Comparator
() {
@Override public int compare(User o1, User o2) {
int tmp=o1.getAge()-o2.getAge(); if(tmp==0){
return o2.getMoney()-o1.getMoney(); } return tmp; } }); System.out.println("排序后"); list.forEach(x->System.out.println(x)); }

执行main方法运行结果如下,也同样实现了我们的需求。

排序前

User(name=Aom, age=38, money=999999)
User(name=Bom, age=28, money=999999)
User(name=Com, age=18, money=999999)
User(name=Dom, age=38, money=888888)
User(name=Gom, age=20, money=666666)
User(name=Eom, age=28, money=888888)
User(name=Fom, age=18, money=888888)
排序后
User(name=Com, age=18, money=999999)
User(name=Fom, age=18, money=888888)
User(name=Gom, age=20, money=666666)
User(name=Bom, age=28, money=999999)
User(name=Eom, age=28, money=888888)
User(name=Aom, age=38, money=999999)
User(name=Dom, age=38, money=888888)

总结

  1. Comparable 排序需要在实体中信息接口中的compareTo,这种方式耦合性较高,当需求变更时需要改动的地方较多,比如需求突然变成先按照金额排序,在排序年龄时,我们就需要重写实体的代码,但是实体的代码在其它地方有引用的情况,那么这个坑就有点大了。
  2. Comparator排序方式将排序逻辑放在外层,我们可以根据实质情况临时调整排序逻辑而不影响实体的结构。从这一点来说个人建议使用Comparator方式进行集合排序。

转载地址:http://cjvzb.baihongyu.com/

你可能感兴趣的文章
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
什么是ActiveRecord
查看>>
有道词典for mac在Mac OS X 10.9不能取词
查看>>
关于“团队建设”的反思
查看>>
利用jekyll在github中搭建博客
查看>>
Windows7中IIS简单安装与配置(详细图解)
查看>>
linux基本命令
查看>>
BlockQueue 生产消费 不需要判断阻塞唤醒条件
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>