通过Java排序List集合的元素的几种方法
用Java工具类Collections的sort()方法,对List集合元素进行排序。
Collections提供两种排序方法:
一、Collections.sort(List<T> list);
此方法需要泛型T这个Bean实现Comparable<T>接口,并且实现compareTo()方法排序;
二、Collections.sort(List<T> list, Comparator<? super T> c);
此方法,在泛型T这个Bean没有实现Comparable<T>接口的时候,多个一个参数,是一个接口我们需要实现其compare()方法排序;
排序List集合里面的元素,例如:
1 /** 2 * 简单的Collection排序 3 */ 4 public static void simpleSort() { 5 List<String> 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<T>接口,并且实现compareTo()方法来自定义排序。例如:
新建Bean:JavaProgrammer :
1 package com.max.basis; 2 3 import java.io.Serializable; 4 5 /** 6 * Java程序员 7 * @author Max. 8 * @date 2018/7/20 9 */ 10 public class JavaProgrammer implements Comparable<JavaProgrammer>, Serializable { 11 /** 12 * 姓名 13 */ 14 private String name; 15 /** 16 * 工资 17 */ 18 private int wage; 19 /** 20 * 年龄 21 */ 22 private int age; 23 24 @Override 25 public int compareTo(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 return sort; 34 } 35 36 public JavaProgrammer(String name, int wage, int age) { 37 this.name = name; 38 this.wage = wage; 39 this.age = age; 40 } 41 42 public String getName() { 43 return name; 44 } 45 46 public void setName(String name) { 47 this.name = name; 48 } 49 50 public int getWage() { 51 return wage; 52 } 53 54 public void setWage(int wage) { 55 this.wage = wage; 56 } 57 58 public int getAge() { 59 return age; 60 } 61 62 public void setAge(int age) { 63 this.age = age; 64 } 65 }
1 /** 2 * Bean实现Comparable接口,实现compareTo()方法来排序 3 */ 4 public static void sortBeans() { 5 List<JavaProgrammer> 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<T>接口,并且实现compareTo()方法,首先根据年龄大小排序,如果年龄相等,在根据工资大小排序;
再看不在Bean里面实现Comparable<T>接口,在需要用到排序的时候,用Collections.sort(List<T> list, Comparator<? super T> c)方法排序,例如:
新建Bean:TestBean :
1 package com.max.basis; 2 3 import java.io.Serializable; 4 5 /** 6 * 测试类 7 * @author Max. 8 * @date 2018/7/20 9 */ 10 public class TestBean implements Serializable { 11 12 private Integer age; 13 14 private Integer score; 15 16 public TestBean(Integer age, Integer score) { 17 this.age = age; 18 this.score = score; 19 } 20 21 public Integer getAge() { 22 return age; 23 } 24 25 public void setAge(Integer age) { 26 this.age = age; 27 } 28 29 public Integer getScore() { 30 return score; 31 } 32 33 public void setScore(Integer score) { 34 this.score = score; 35 } 36 }
1 /** 2 * 在Collection排序的时候给人Comparator参数 3 */ 4 private static void sortTestBean() { 5 List<TestBean> 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<TestBean>() { 11 @Override 12 public int compare(TestBean o2, TestBean o1) { 13 int sort = o1.getAge() - o2.getAge(); 14 if (sort == 0) { 15 return o1.getScore() - o2.getScore(); 16 } 17 return sort; 18 } 19 }); 20 for (TestBean testBean : sortList) { 21 System.out.println("年龄:" + testBean.getAge() 22 + ",总分:" + testBean.getScore()); 23 } 24 }
输出结果:
年龄:19,总分:497 年龄:18,总分:512 年龄:18,总分:402 年龄:17,总分:633
注意:如果需要排序或者降序,只需要把o1.getAge() - o2.getAge()两个互换位置就可以了。
然而上面的例子只是对List集合的英文及数字排序,再来看看Collections.sort 中文排序。
public static void sortString(){ List<String> 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<String> comparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { Collator collator = Collator.getInstance(); return collator.getCollationKey(o1).compareTo(collator.getCollationKey(o2)); } }; Collections.sort(sortStringList,comparator); System.out.println("排序之后的List:" + sortStringList); }
输出结果:
未排序之前的List:[刘邦, 项羽, 关羽, 赵云, 诸葛亮, 曹操, 曹操到, LOL, 赵高, 10086]
排序之后的List:[10086, LOL, 曹操, 曹操到, 关羽, 刘邦, 项羽, 赵高, 赵云, 诸葛亮]
排序规则是:数字排在最前,英文字母其次,汉字则按照拼音进行排序。