您好,登录后才能下订单哦!
本篇内容介绍了“Java中Collections.sort对List排序的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
说到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实现比较器,是定义在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; } else { //首先比较名字,名字不一样,则返回比较结果 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实现比较器,是定义在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; } else { //首先比较名字,名字不一样,则返回比较结果 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<Person>(); 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对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排序的方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。