先来一个简单的实现
这里实现 Comparable 接口,重写compareTo方法实现排序,当两个对象进行比较时,返回0代表它们相等;返回值<0,代表this排在被比较对象之前;反之代表在被比较对象之后
1 package com.sun.comparator; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.List; 7 8 public class ComparatorDemo implements Comparable<ComparatorDemo> { 9 10 private String name; 11 private Integer age; 12 private float score; 13 14 public ComparatorDemo(String name, Integer age, float score) { 15 super(); 16 this.name = name; 17 this.age = age; 18 this.score = score; 19 } 20 21 @Override 22 public String toString() { 23 return "name:" + name + ";age:" + age + ";score:" + score; 24 } 25 26 @Override 27 public int compareTo(ComparatorDemo o) { 28 if (this.score > o.score)// score是private的,为什么能够直接调用,这是因为在Student类内部 29 return -1;// 由高到底排序 30 else if (this.score < o.score) 31 return 1; 32 else { 33 if (this.age > o.age) 34 return 1;// 由底到高排序 35 else if (this.age < o.age) 36 return -1; 37 else 38 return 0; 39 } 40 } 41 42 public static void main(String[] args) { 43 List<ComparatorDemo> lists = new ArrayList<>(); 44 lists.add(new ComparatorDemo("a", 4, 4)); 45 lists.add(new ComparatorDemo("b", 3, 6)); 46 lists.add(new ComparatorDemo("c", 2, 3)); 47 lists.add(new ComparatorDemo("d", 1, 7)); 48 Collections.sort(lists); 49 for (ComparatorDemo comparatorDemo : lists) { 50 System.out.println("++++++" + comparatorDemo); 51 } 52 53 ComparatorDemo com[] = {new ComparatorDemo("a", 4, 4), 54 new ComparatorDemo("b", 3, 6), 55 new ComparatorDemo("c", 2, 3), 56 new ComparatorDemo("d", 1, 7)}; 57 Arrays.sort(com); 58 for (ComparatorDemo comparatorDemo : com) { 59 System.out.println("------" + comparatorDemo); 60 } 61 } 62 63 public String getName() { 64 return name; 65 } 66 67 public void setName(String name) { 68 this.name = name; 69 } 70 71 public Integer getAge() { 72 return age; 73 } 74 75 public void setAge(Integer age) { 76 this.age = age; 77 } 78 79 public float getScore() { 80 return score; 81 } 82 83 public void setScore(float score) { 84 this.score = score; 85 } 86 87 }
另一种方式
1 package com.sun.comparator; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.Comparator; 7 import java.util.List; 8 9 public class ComparatorDemo2 { 10 11 private String name; 12 private Integer age; 13 private float score; 14 15 public ComparatorDemo2(String name, Integer age, float score) { 16 super(); 17 this.name = name; 18 this.age = age; 19 this.score = score; 20 } 21 22 @Override 23 public String toString() { 24 return "name:" + name + ";age:" + age + ";score:" + score; 25 } 26 27 28 @SuppressWarnings({ "rawtypes", "unchecked" }) 29 public static void main(String[] args) { 30 List<ComparatorDemo2> lists = new ArrayList<>(); 31 lists.add(new ComparatorDemo2("a", 4, 4)); 32 lists.add(new ComparatorDemo2("b", 3, 6)); 33 lists.add(new ComparatorDemo2("c", 2, 3)); 34 lists.add(new ComparatorDemo2("d", 1, 7)); 35 Comparator c = new ComparatorList(); 36 Collections.sort(lists, c); 37 for (ComparatorDemo2 comparatorDemo : lists) { 38 System.out.println("++++++" + comparatorDemo); 39 } 40 41 ComparatorDemo2 com[] = {new ComparatorDemo2("a", 4, 4), 42 new ComparatorDemo2("b", 3, 6), 43 new ComparatorDemo2("c", 2, 3), 44 new ComparatorDemo2("d", 1, 7)}; 45 Arrays.sort(com, c); 46 for (ComparatorDemo2 comparatorDemo : com) { 47 System.out.println("------" + comparatorDemo); 48 } 49 } 50 51 public String getName() { 52 return name; 53 } 54 55 public void setName(String name) { 56 this.name = name; 57 } 58 59 public Integer getAge() { 60 return age; 61 } 62 63 public void setAge(Integer age) { 64 this.age = age; 65 } 66 67 public float getScore() { 68 return score; 69 } 70 71 public void setScore(float score) { 72 this.score = score; 73 } 74 75 }
1 package com.sun.comparator; 2 3 import java.util.Comparator; 4 5 public class ComparatorList implements Comparator<ComparatorDemo2>{ 6 //我们也可以通过构造方法注入一些参数加入到比较中 7 8 @Override 9 public int compare(ComparatorDemo2 o1, ComparatorDemo2 o2) { 10 if (o1.getScore() > o2.getScore()) 11 return -1;// 由高到底排序 12 else if (o1.getScore() < o2.getScore()) 13 return 1; 14 else { 15 if (o1.getAge() > o2.getScore()) 16 return 1;// 由底到高排序 17 else if (o1.getAge() < o2.getAge()) 18 return -1; 19 else 20 return 0; 21 } 22 } 23 24 }
下面是多个属性联合排序,注意,这里使用BeanComparator实现
1 package com.sun.comparator; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 7 import org.apache.commons.beanutils.BeanComparator; 8 import org.apache.commons.collections.ComparatorUtils; 9 import org.apache.commons.collections.comparators.ComparableComparator; 10 import org.apache.commons.collections.comparators.ComparatorChain; 11 12 public class ComplexComparator { 13 private int id; 14 private String name; 15 private String age; 16 17 public ComplexComparator(){} 18 19 public ComplexComparator(int id, String age,String name) { 20 this.id = id; 21 this.name = name; 22 this.age = age; 23 } 24 25 @SuppressWarnings({ "unchecked", "rawtypes" }) 26 public static void main(String[] args) { 27 28 //在列表中加入若干ComplexComparator对象 29 ArrayList<Object> list = new ArrayList<Object>(); 30 list.add(new ComplexComparator(1,"3","五")); 31 list.add(new ComplexComparator(1,"1","六")); 32 list.add(new ComplexComparator(1,"5","二")); 33 list.add(new ComplexComparator(1,"4","四")); 34 list.add(new ComplexComparator(4,"2","一")); 35 36 //创建一个排序规则 37 Comparator mycmp = ComparableComparator.getInstance(); 38 mycmp = ComparatorUtils.nullLowComparator(mycmp); //允许null 39 mycmp = ComparatorUtils.reversedComparator(mycmp); //逆序 40 41 //声明要排序的对象的属性,并指明所使用的排序规则,如果不指明,则用默认排序 42 ArrayList<Object> sortFields = new ArrayList<Object>(); 43 sortFields.add(new BeanComparator("id", mycmp)); //id逆序 (主) 44 sortFields.add(new BeanComparator("age")); //name正序 (副) 45 46 //创建一个排序链 47 ComparatorChain multiSort = new ComparatorChain(sortFields); 48 49 //开始真正的排序,按照先主,后副的规则 50 Collections.sort(list,multiSort); 51 52 for (int i =0;i<list.size();i++) { 53 System.out.println(list.get(i)); //输出 54 } 55 /** 56 * 输出结果如下: 57 * [id=4,name=2,age=一] 58 * [id=1,name=1,age=六] 59 * [id=1,name=3,age=五] 60 * [id=1,name=4,age=四] 61 * [id=1,name=5,age=二] 62 */ 63 } 64 65 public int getId() { 66 return this.id; 67 } 68 69 public void setId(int id) { 70 this.id = id; 71 } 72 73 public String getName() { 74 return this.name; 75 } 76 77 public void setName(String name) { 78 this.name = name; 79 } 80 81 public String toString() { 82 return "[id=" + this.id + ",name=" + this.name +",age=" + this.age +"]"; 83 } 84 85 public String getAge() { 86 return age; 87 } 88 89 public void setAge(String age) { 90 this.age = age; 91 } 92 }
按照某一项分组,然后按照另一项排序
1 package com.sun.comparator; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.List; 7 8 import org.apache.commons.beanutils.BeanComparator; 9 import org.apache.commons.collections.ComparatorUtils; 10 11 public class ComparatorUtilsDemo implements Comparator<ComparatorUtilsDemo> { 12 private String name; 13 private Integer age; 14 private float score; 15 public ComparatorUtilsDemo(){} 16 17 public ComparatorUtilsDemo(String name, Integer age, float score) { 18 super(); 19 this.name = name; 20 this.age = age; 21 this.score = score; 22 } 23 24 @Override 25 public int compare(ComparatorUtilsDemo o1, ComparatorUtilsDemo o2) { 26 if (o1.getScore() > o2.getScore()) 27 return -1;// 由高到底排序 28 else if (o1.getScore() < o2.getScore()) 29 return 1; 30 else 31 return 0; 32 } 33 34 @Override 35 public String toString() { 36 return "name:" + name + ";age:" + age + ";score:" + score; 37 } 38 39 public static void main(String[] args) { 40 List<ComparatorUtilsDemo> lists = new ArrayList<>(); 41 lists.add(new ComparatorUtilsDemo("a", 4, 4)); 42 lists.add(new ComparatorUtilsDemo("d", 4, 4)); 43 lists.add(new ComparatorUtilsDemo("a", 4, 4)); 44 lists.add(new ComparatorUtilsDemo("c", 4, 4)); 45 lists.add(new ComparatorUtilsDemo("a", 4, 4)); 46 lists.add(new ComparatorUtilsDemo("b", 4, 4)); 47 lists.add(new ComparatorUtilsDemo("b", 3, 6)); 48 lists.add(new ComparatorUtilsDemo("c", 2, 3)); 49 lists.add(new ComparatorUtilsDemo("d", 1, 7)); 50 lists.add(new ComparatorUtilsDemo("a", 1, 7)); 51 Collections.sort(lists, ComparatorUtils.chainedComparator(new BeanComparator("name"), new ComparatorUtilsDemo())); 52 for (ComparatorUtilsDemo c : lists) { 53 System.out.println("++++++" + c); 54 } 55 } 56 57 public String getName() { 58 return name; 59 } 60 61 public void setName(String name) { 62 this.name = name; 63 } 64 65 public Integer getAge() { 66 return age; 67 } 68 69 public void setAge(Integer age) { 70 this.age = age; 71 } 72 73 public float getScore() { 74 return score; 75 } 76 77 public void setScore(float score) { 78 this.score = score; 79 } 80 }