下面给出一个例子详细讲解Comparator实现自定义排序
1. 定义一个实体类Person
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
package map; /** * Created by benjamin on 11/5/15. */public class Person { String firstName,lastName; char sex; Integer age; public Person(String firstName, String lastName, char sex, Integer age) { this.firstName = firstName; this.lastName = lastName; this.sex = sex; this.age = age; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }} |
2. 比较器公共方法
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
package map; /** * Created by benjamin on 11/5/15. */ import java.util.Comparator; /** * 谁的拼音靠前,谁就排前面. * 然后对名字进行排序.如果同名,女性排前面. * 如果名字和性别都相同,年龄小的排前面. * * * int compare(Object o1, Object o2)返回一个基本的数据类型 * 如果要按照升序排序 * 则o1 < o2, return -1; equals return 0; o1 > 02 return 1; * 如果要按照降序排序 * 则01 < 02, return 1; equals return 0; o1 > o2 return -1; * */public class Comparators { /** * 获取合适的比较器 * @return */ public static Comparator getComparator() { return new Comparator() { @Override public int compare(Object o1, Object o2) { if(o1 instanceof String) { return compare((String)o1, (String)o2); } else if(o1 instanceof Integer) { return compare((Integer)o1, (Integer)o2); } else if(o1 instanceof Person) { return comparePerson((Person) o1, (Person) o2); } else { System.out.println("未找到合适的比较器"); return 1; } } }; } private static int compare(String o1, String o2) { int len1 = o1.length(); int len2 = o2.length(); int min = Math.min(len1, len2); char v1[] = o1.toCharArray(); char v2[] = o2.toCharArray(); int pos = 0; //循环得到名字的排序 while(--min != 0) { char c1 = v1[pos]; char c2 = v2[pos]; if (c1 != c2) { return c1 - c2; } pos ++; } return len1 - len2; } /** * 比较年龄 * @param o1 * @param o2 * @return */ private static int compare(Integer o1, Integer o2) { int val1 = o1.intValue(); int val2 = o2.intValue(); return val1 < val2 ? -1 : (val1 == val2 ? 0 : 1); } /** * 比较性别 * @param o1 * @param o2 * @return */ private static int compare(char o1, char o2) { return ((o1 == o2) ? 0 : (o1 == '男' ? 1 : -1)); } /** * 比较Person * @param o1 * @param o2 * @return */ private static int comparePerson(Person o1, Person o2) { String firstName1 = o1.getFirstName(); String firstName2 = o2.getFirstName(); String lastName1 = o1.getLastName(); String lastName2 = o2.getLastName(); char sex1 = o1.getSex(); char sex2 = o2.getSex(); Integer age1 = o1.getAge(); Integer age2 = o2.getAge(); return (compare(firstName1, firstName2) == 0 ? (compare(lastName1, lastName2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 : compare(age1, age2)) : compare(sex1, sex2)) : compare(lastName1, lastName2)) : compare(firstName1, firstName2)); } } |
3. 测试排序
123456789101112131415161718192021222324252627 |
package map; import java.util.Arrays; /** * Created by benjamin on 11/5/15. */public class ComparatorsTest { public static void main(String[] args) { Person[] person = new Person[]{ new Person("ouyang", "feng", '男', new Integer(27)), new Person("zhuang", "gw", '男', new Integer(27)), new Person("deng", "jx", '男', new Integer(28)), new Person("deng", "jx", '女', new Integer(27)) }; for (Person p : person) { System.out.println("排序前=" + p.getFirstName() + " " + p.getLastName() + " " + p.getSex() + " " + p.getAge()); } Arrays.sort(person, Comparators.getComparator()); System.out.println("----------------------------------------------------"); for (Person p : person) { System.out.println("排序前=" + p.getFirstName() + " " + p.getLastName() + " " + p.getSex() + " " + p.getAge()); } }} |
4. 输出结果
12345678910 |
排序前=ouyang feng 男 27排序前=zhuang gw 男 27排序前=deng jx 男 28排序前=deng jx 女 27 ----------------------------------------------------排序前=deng jx 女 27排序前=deng jx 男 28排序前=ouyang feng 男 27排序前=zhuang gw 男 27 |
时间: 2024-08-03 16:09:34