有朋友看了昨天写的《浅析Java中 Collections.reverse(List list)》后,想了解一下Java中给集合排序的方法,今天就说说在Java中怎么对List集合做排序吧。
01通过类实现Comparable的方式实现排序
先来看下示例中要往集合中存放的对象的类。
定义了一个程序员(Programmer)的类,类中有三个字段,name(姓名),age(年龄),level(等级)。实现了Comparable接口,在实现接口的compareTo方法中是按照类中的年龄比较结果作为这个类的比较结果。
插点题外话,有的朋友可能没有用过,对类上的两个注解不太清楚。这里大概说一下。为了不对后续代码中方法的使用有疑问。
@Data和@AllArgsConstructor这两个注解是lombok的两个注解。他们的功能是在代码编译时增加一些代码,从而达到让程序员减少编码工作量的效果。
@Data这个注解,可以在编译时,针对类中的字段增加对应的get、set方法。
而@AllArgsConstructor这个方法,可以在编译时,在类中增加一个包含所有字段作为参数的构造方法。
回到正题,类实现了Comparable接口后,怎么来对List做排序呢。
来看示例代码。
还是Collections这个类,提供了一个sort方法。
执行一下,看看运行结果,是不是会对这个集合做排序。
执行Collections.sort之前输出的结果的顺序是按照插入的顺序,而执行Collections.sort之后输出的结果的顺序,就是按照我们在Programmer类中实现Comparable时指定的按照年龄做排序了。
02通过比较器Comparator进行排序
可是如果我们还想对上面的集合按照level(等级)做一下排序那要怎么做呢。
Comparable接口执行实现一次,不能再通过实现Comparable接口的方式来做了。
Collections.sort还有一个重载的方法,是两个参数,第一个参数是要做排序的集合,第二个参数就是一个比较器Comparator的对象。
先来定义一个针对Programmer类针对level(等级)字段的比较器类。
是不是很简单,这次为了实现降序,在方法体内将o2这个参数放在了compareTo方法的左边。
再来看看怎么用这个比较器来排序。
和刚才的代码比只是在调用Collections.sort这个方法时,多加了一个参数,这个参数就是实例化了一个刚定义的比较器LevelComparator的对象。
执行看看,是不是按照level做了降序。
成功,是按照level降序对集合做了排序。
如果刚定义的这个比较器只是在这里用一次,其他地方不再进行使用,就可以不去专门定义一个类了。可以通过匿名内部来的方式来实现。像下面这样。
排序说完了。再说一个关于Collections.sort这个方法可能已经人尽皆知的秘密吧。
上面是Collections.sort的两个方法,大家看到没有,其实排序是要被排序的list自己做的。
今天的内容就到这里了。欢迎大家来场子里聊天讨论,留下神评。