首页 > 作文

浅谈Java中Collections.sort对List排序的两种方法

更新时间:2023-04-04 00:18:30 阅读: 评论:0

目录
一、collections.sort的简单使用 二、问题提出 三、comparable实现排序 四、comparator实现排序 五、comparable 与comparator区别

一、collections.sort的简单使用

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

 private void sortstrings() {  list<string> list = new arraylist<string>();  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<string>的排序,非常简单。

二、问题提出

但在我们的项目中列表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<person>进行排序,首先想到的也是通过collections.sort进行排序:

 private void sortperson() {  person p1 = new person("ccc", 20);  person p2 = new person("aaa", 18);  person p3 = new person("bbb", 16);    list<person> list = new arraylist<person>();  list.add(p1);  list.add(p2);  list.add(开车旅行p3);    //排序  collections.sort(list); }

发现,代码直接报错了:

bound mismatch: the generic method sort(list<t>) of type collections is not applicable for the arguments (list<person初中地理总复习资料>). the inferred type person is not a valid substitute for the bounded
parameter <t extends comparable<? super t>>

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

三、comparable实现排序

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

public class person implements comparable<person> {  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;  } el { //首先比较名字,名字不一样,则返回比较结果   return i;  } }}

后面就是对list<person>进行排序并输出:

 private void sortbycomparable() {  person p1 = new person("bbb", 20);  person p2 = new person("aaa", 18);  person p3 = new person("bbb", 16);    list<person> list = new arraylist<person>();  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<person> {   public int compare(person one, person two) {   int i = one.name.compareto(two.name); //比较名字字符串   if (i == 0) { //如果名字一样,则继续比较年龄    return one.age - two.age;   } el { //首先比较名字,名字不一样,则返回比较结果    return i;   }  }   }

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

最后,当然是用我们的比较器对list<person>进行排序:

 private void sortbycomparator() {  person p1 = new person("bbb", 20);  person p2 = new person("aaa", 18);  person p3 = new person("bbb", 16);    list<person> list = new arraylist<pe读书笔记的格式rson>();  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排序的两种方法的文章就介绍到这了,更多相关java中collections.sort list排序 多彩的活动作文600字六年级内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 00:18:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/476994a46101bc75408680d2f19232fc.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:浅谈Java中Collections.sort对List排序的两种方法.doc

本文 PDF 下载地址:浅谈Java中Collections.sort对List排序的两种方法.pdf

标签:名字   规则   实体类   方法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图