用Java工具类Collections的sort()方法,对List集合元素进行排序。
Collections提供两种排序方法:
一、Collections.sort(List list);
此方法需要泛型T这个Bean实现Comparable接口,并且实现compareTo()方法排序;
二、Collections.sort(List list, Comparator super T> c);
此方法,在泛型T这个Bean没有实现Comparable接口的时候,多个一个参数,是一个接口我们需要实现其compare()方法排序;
排序List集合里面的元素,例如:
1 /**
2 * 简单的Collection排序3 */
4 public static voidsimpleSort() {5 List sortElement = new ArrayList<>();6 sortElement.add("A");7 sortElement.add("D");8 sortElement.add("R");9 sortElement.add("T");10 sortElement.add("F");11 System.out.println("未排序之前的List:" +sortElement);12 Collections.sort(sortElement);13 System.out.println("排序之后的List:" +sortElement);14 }
输出结果:
未排序之前的List:[A, D, R, T, F]
排序之后的List:[A, D, F, R, T]
由于String类其实自身已经实现了Comparable接口,Java已经帮我们封装好了,所以我们不需要再实现compareTo()方法;
下面来看下,新建一个Bean,实现Comparable接口,并且实现compareTo()方法来自定义排序。例如:
新建Bean:JavaProgrammer :
1 packagecom.max.basis;2
3 importjava.io.Serializable;4
5 /**
6 * Java程序员7 *@authorMax.8 * @date /7/209 */
10 public class JavaProgrammer implements Comparable, Serializable {11 /**
12 * 姓名13 */
14 privateString name;15 /**
16 * 工资17 */
18 private intwage;19 /**
20 * 年龄21 */
22 private intage;23
24 @Override25 public intcompareTo(JavaProgrammer o) {26 //首先根据年龄排序
27 int sort = this.getAge() -o.getAge();28 //返回值0代表相等,1表示大于,-1表示小于;
29 if (sort == 0) {30 //在根据工资排序
31 return this.getWage() -o.getWage();32 }33 returnsort;34 }35
36 public JavaProgrammer(String name, int wage, intage) {37 this.name =name;38 this.wage =wage;39 this.age =age;40 }41
42 publicString getName() {43 returnname;44 }45
46 public voidsetName(String name) {47 this.name =name;48 }49
50 public intgetWage() {51 returnwage;52 }53
54 public void setWage(intwage) {55 this.wage =wage;56 }57
58 public intgetAge() {59 returnage;60 }61
62 public void setAge(intage) {63 this.age =age;64 }65 }
1 /**
2 * Bean实现Comparable接口,实现compareTo()方法来排序3 */
4 public static voidsortBeans() {5 List sortBeans = new ArrayList<>();6 sortBeans.add(new JavaProgrammer("A", 20000, 20));7 sortBeans.add(new JavaProgrammer("B", 55000, 21));8 sortBeans.add(new JavaProgrammer("C", 65000, 20));9 sortBeans.add(new JavaProgrammer("D", 120000, 28));10 sortBeans.add(new JavaProgrammer("E", 90000, 23));11 Collections.sort(sortBeans);12 for(JavaProgrammer javaProgrammer : sortBeans) {13 System.out.println("姓名:" +javaProgrammer.getName()14 + ",工资:" +javaProgrammer.getWage()15 + ",年龄:" +javaProgrammer.getAge());16 }17 }
输出结果:
姓名:A,工资:20000,年龄:20姓名:C,工资:65000,年龄:20姓名:B,工资:55000,年龄:21姓名:E,工资:90000,年龄:23姓名:D,工资:120000,年龄:28
看到上面的Bean,实现了Comparable接口,并且实现compareTo()方法,首先根据年龄大小排序,如果年龄相等,在根据工资大小排序;
再看不在Bean里面实现Comparable接口,在需要用到排序的时候,用Collections.sort(List list, Comparator super T> c)方法排序,例如:
新建Bean:TestBean:
1 packagecom.max.basis;2
3 importjava.io.Serializable;4
5 /**
6 * 测试类7 *@authorMax.8 * @date /7/209 */
10 public class TestBean implementsSerializable {11
12 privateInteger age;13
14 privateInteger score;15
16 publicTestBean(Integer age, Integer score) {17 this.age =age;18 this.score =score;19 }20
21 publicInteger getAge() {22 returnage;23 }24
25 public voidsetAge(Integer age) {26 this.age =age;27 }28
29 publicInteger getScore() {30 returnscore;31 }32
33 public voidsetScore(Integer score) {34 this.score =score;35 }36 }
1 /**
2 * 在Collection排序的时候给人Comparator参数3 */
4 private static voidsortTestBean() {5 List sortList = new ArrayList<>();6 sortList.add(new TestBean(18, 402));7 sortList.add(new TestBean(18, 512));8 sortList.add(new TestBean(17, 633));9 sortList.add(new TestBean(19, 497));10 Collections.sort(sortList, new Comparator() {11 @Override12 public intcompare(TestBean o2, TestBean o1) {13 int sort = o1.getAge() -o2.getAge();14 if (sort == 0) {15 return o1.getScore() -o2.getScore();16 }17 returnsort;18 }19 });20 for(TestBean testBean : sortList) {21 System.out.println("年龄:" +testBean.getAge()22 + ",总分:" +testBean.getScore());23 }24 }
输出结果:
年龄:19,总分:497年龄:18,总分:5龄:18,总分:402年龄:17,总分:633
注意:如果需要排序或者降序,只需要把o1.getAge() - o2.getAge()两个互换位置就可以了。
然而上面的例子只是对List集合的英文及数字排序,再来看看Collections.sort 中文排序。
public static voidsortString(){
List sortStringList = new ArrayList<>();
sortStringList.add("刘邦");
sortStringList.add("项羽");
sortStringList.add("关羽");
sortStringList.add("赵云");
sortStringList.add("诸葛亮");
sortStringList.add("曹操");
sortStringList.add("曹操到");
sortStringList.add("LOL");
sortStringList.add("赵高");
sortStringList.add("10086");
System.out.println("未排序之前的List:" +sortStringList);
Comparator comparator = new Comparator() {
@Overridepublic intcompare(String o1, String o2) {
Collator collator=Collator.getInstance();returncollator.getCollationKey(o1).compareTo(collator.getCollationKey(o2));
}
};
Collections.sort(sortStringList,comparator);
System.out.println("排序之后的List:" +sortStringList);
}
输出结果:
未排序之前的List:[刘邦, 项羽, 关羽, 赵云, 诸葛亮, 曹操, 曹操到, LOL, 赵高, 10086]
排序之后的List:[10086, LOL, 曹操, 曹操到, 关羽, 刘邦, 项羽, 赵高, 赵云, 诸葛亮]
排序规则是:数字排在最前,英文字母其次,汉字则按照拼音进行排序。