千家信息网

Java中Collections.sort对List排序的方法有哪些

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"Java中Collections.sort对List排序的方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希
千家信息网最后更新 2026年11月02日Java中Collections.sort对List排序的方法有哪些

本篇内容介绍了"Java中Collections.sort对List排序的方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、Collections.sort的简单使用

说到List的排序,第一反应当然是使用Collections.sort,方便简单。下面实现一下~~

 private void sortStrings() {  List list = new ArrayList();  list.add("ccc");  list.add("aaa");  list.add("bbb");  //排序  Collections.sort(list);  //输出  Log.d(TAG, "-----------对字符串排序-----------");  for(String item : list) {   Log.d(TAG, item.toString());  } }

=02-03 10:32:25.821: D/wxx(4732): -----------对字符串排序-----------
02-03 10:32:25.821: D/wxx(4732): aaa
02-03 10:32:25.821: D/wxx(4732): bbb
02-03 10:32:25.821: D/wxx(4732): ccc

可见,实现了对List的排序,非常简单。

二、问题提出

但在我们的项目中列表List的元素类型经常是自定义的,下面自定义了一个实体类Person:

public class Person {  private String name; private int age;  public Person(String name, int age) {  this.name = name;  this.age = age; }}

然后,想对Person的列表List进行排序,首先想到的也是通过Collections.sort进行排序:

 private void sortPerson() {  Person p1 = new Person("ccc", 20);  Person p2 = new Person("aaa", 18);  Person p3 = new Person("bbb", 16);    List list = new ArrayList();  list.add(p1);  list.add(p2);  list.add(p3);    //排序  Collections.sort(list); }

发现,代码直接报错了:

Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (List). The inferred type Person is not a valid substitute for the bounded
parameter >

从上面可知,Person不是一个有效的参数类型,而应该extends Comparable。为什么?
原来,要排序嘛当然要有排序的规则,比如按身高从高到低,按年龄从小到大,等等,也就是要有比较。而String这个对象已经帮我们实现了Comparable接口,所以String类型自己就是可以比较的。而我们的Person如果想要排序,也必须能够按某种规则进行比较,也就是要实现一个比较器。我们可以通过实现Comparable或Comparator接口实现比较器 。

三、Comparable实现排序

Comparable实现比较器,是定义在Person类的内部的,所以实体类Person需要implements Comparable,然后重写compareTo方法,在此方法里实现比较规则,规则就是先比较名字,如果名字不一样则返回比较结果,如果名字一样,再比较年龄,返回比较结果:

public class Person implements Comparable {  public String name; public int age;  public Person(String name, int age) {  this.name = name;  this.age = age; }  public int compareTo(Person another) {  int i = name.compareTo(another.name); //比较名字字符串  if (i == 0) { //如果名字一样,则继续比较年龄   return age - another.age;  } else { //首先比较名字,名字不一样,则返回比较结果   return i;  } }}

后面就是对List进行排序并输出:

 private void sortByComparable() {  Person p1 = new Person("bbb", 20);  Person p2 = new Person("aaa", 18);  Person p3 = new Person("bbb", 16);    List list = new ArrayList();  list.add(p1);  list.add(p2);  list.add(p3);    //排序  Collections.sort(list);  //输出  Log.d(TAG, "-----------使用Comparable实现的排序-----------");  for(Person item : list) {   Log.d(TAG, "name = "+item.name+", age = "+item.age);  } }

检查输出结果是否正确:

02-03 12:05:31.356: D/wxx(9936): -----------使用Comparable实现的排序-----------
02-03 12:05:31.356: D/wxx(9936): name = aaa, age = 18
02-03 12:05:31.356: D/wxx(9936): name = bbb, age = 16
02-03 12:05:31.356: D/wxx(9936): name = bbb, age = 20

四、Comparator实现排序

Comparator实现比较器,是定义在Person类的外部的,因此实体类Person不需要做任何变化,如下:

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

我们的比较器My Comparator的实现,主要是覆盖compare方法,在这个方法内实现比较的规则,具体代码:

 public class MyComparator implements Comparator {   public int compare(Person one, Person two) {   int i = one.name.compareTo(two.name); //比较名字字符串   if (i == 0) { //如果名字一样,则继续比较年龄    return one.age - two.age;   } else { //首先比较名字,名字不一样,则返回比较结果    return i;   }  }   }

上面的排序规则是:先比较name值进行排序,如果name值一样 ,再比较age值排序。

最后,当然是用我们的比较器对List进行排序:

 private void sortByComparator() {  Person p1 = new Person("bbb", 20);  Person p2 = new Person("aaa", 18);  Person p3 = new Person("bbb", 16);    List list = new ArrayList();  list.add(p1);  list.add(p2);  list.add(p3);    //排序  Collections.sort(list, new MyComparator());  //输出  Log.d(TAG, "-----------使用Comparator实现的排序-----------");  for(Person item : list) {   Log.d(TAG, "name = "+item.name+", age = "+item.age);  } }

查看排序后的输出结果是否正确:

02-03 11:51:34.996: D/wxx(1355): -----------使用Comparator实现的排序-----------
02-03 11:51:34.996: D/wxx(1355): name = aaa, age = 18
02-03 11:51:35.001: D/wxx(1355): name = bbb, age = 16
02-03 11:51:35.001: D/wxx(1355): name = bbb, age = 20

五、Comparable 与Comparator区别

上面已经分别实现了Comparable 与Comparator对List进行排序,他们有相似的地方,也有不同的地方:

1)Comparable 与Comparator都是java的接口,用来对自定义的实体对象进行比较;

2)Comparable 是定义在实体类内部的,所以实体类对象本身就有比较大小的可能。但如果想换一种比较规则,如先按年龄后按名字排序,那么就必须修改实体类Person本身;

3)Comparator是在实体类外部实现比较器的,所以对List排序时必须同时传入数据和比较器,如Collections.sort(list, new MyComparator());如果想换一种比较规则,则仅需要修改比较器MyComparator,而实体类Person则不需要改变;所以建议使用这种方法;

4)Comparable实现代码相对简单,Comparator实现代码相对复杂一点,但还是建议使用Comparator方法。

"Java中Collections.sort对List排序的方法有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

排序 名字 实体 比较器 规则 方法 输出 结果 年龄 代码 字符 字符串 对象 就是 接口 类型 也就是 内容 地方 建议 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州为想互联网科技有限公司 互联网和科技技术 互联网巨头科技公司 科技互联网技术 互联网公司 科技公司 成都互联网科技公司 壕鑫互联网络科技 碳银互联网科技有限公司 齐家互联网科技有限公司 欧洲十大科技互联网公司 成都互联网科技公司100强 岳阳华臻互联网科技有限公司 赶超互联网科技 微信多开 互联网科技革命什么开始 米聚互联网科技南京有限公司排面 中国互联网十大科技股排名 城市宝互联网科技有限公司 昆明中奇联合互联网科技 现代互联网科技公司 互联网金融金融科技 互联网科技公司发展 奇酷互联网科技 互联网科技ppt模板 北京大学互联网科技怎么样 开一家科技互联网公司需要多少钱 银川新华互联网科技学校联系电话 小米互联网科技园入驻 皮皮虾互联网科技有限公司 富国互联网金融科技混合基金 互联网 科技节活动 微视频大赛
0