java list 多列排序_Java中对List做排序要怎么做?请看正文

有朋友看了昨天写的《浅析Java中 Collections.reverse(List list)》后,想了解一下Java中给集合排序的方法,今天就说说在Java中怎么对List集合做排序吧。

08bd7555576e3a888577b586650bf8ca.png

01通过类实现Comparable的方式实现排序

先来看下示例中要往集合中存放的对象的类。

1c75a8e810b31262387f72272f34e059.png

定义了一个程序员(Programmer)的类,类中有三个字段,name(姓名),age(年龄),level(等级)。实现了Comparable接口,在实现接口的compareTo方法中是按照类中的年龄比较结果作为这个类的比较结果。

插点题外话,有的朋友可能没有用过,对类上的两个注解不太清楚。这里大概说一下。为了不对后续代码中方法的使用有疑问。

@Data和@AllArgsConstructor这两个注解是lombok的两个注解。他们的功能是在代码编译时增加一些代码,从而达到让程序员减少编码工作量的效果。

@Data这个注解,可以在编译时,针对类中的字段增加对应的get、set方法。

而@AllArgsConstructor这个方法,可以在编译时,在类中增加一个包含所有字段作为参数的构造方法。

回到正题,类实现了Comparable接口后,怎么来对List做排序呢。

来看示例代码。

0b24c6fdbee727a94037202bcfcd2e7e.png

还是Collections这个类,提供了一个sort方法。

执行一下,看看运行结果,是不是会对这个集合做排序。

a9baffcba7c6de682a846ff4f7fbf953.png

执行Collections.sort之前输出的结果的顺序是按照插入的顺序,而执行Collections.sort之后输出的结果的顺序,就是按照我们在Programmer类中实现Comparable时指定的按照年龄做排序了。

02通过比较器Comparator进行排序

可是如果我们还想对上面的集合按照level(等级)做一下排序那要怎么做呢。

Comparable接口执行实现一次,不能再通过实现Comparable接口的方式来做了。

Collections.sort还有一个重载的方法,是两个参数,第一个参数是要做排序的集合,第二个参数就是一个比较器Comparator的对象。

先来定义一个针对Programmer类针对level(等级)字段的比较器类。

295e70317ae5c0ceb10400e0db5c531d.png

是不是很简单,这次为了实现降序,在方法体内将o2这个参数放在了compareTo方法的左边。

再来看看怎么用这个比较器来排序。

f7f4fb6d8a6872adca3e8ea50c5bda07.png

和刚才的代码比只是在调用Collections.sort这个方法时,多加了一个参数,这个参数就是实例化了一个刚定义的比较器LevelComparator的对象。

执行看看,是不是按照level做了降序。

9b4348abb5f0e9dd83041ac011c6e31c.png

成功,是按照level降序对集合做了排序。

如果刚定义的这个比较器只是在这里用一次,其他地方不再进行使用,就可以不去专门定义一个类了。可以通过匿名内部来的方式来实现。像下面这样。

29cd12bbfec308f39440be8518d6bc09.png

排序说完了。再说一个关于Collections.sort这个方法可能已经人尽皆知的秘密吧。

089af962dffc4240f76671bf3cb05dcd.png

031674e0578741f6791251c020ebb7e2.png

上面是Collections.sort的两个方法,大家看到没有,其实排序是要被排序的list自己做的。

今天的内容就到这里了。欢迎大家来场子里聊天讨论,留下神评。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值