JAVA对象比较器Comparator

来源:互联网 发布:spark sql python 编辑:程序博客网 时间:2024/05/19 17:05
排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。
如将下列数字进行排序
1,3,5,8,3,6
于是我们得出结果
1,3,3,5,6,8
将下列字母(字符)进行排序
a,i,e,f,w,s
于是我们得出结果
a,e,f,i,s,w
但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信般简单。同一商品名称可以有不同的批次,进货时间,可能还会有单价的不同。显然只根据商品名称排序是不合理的。

再举个简单例子然后用程序实现。如公司要将员工进行排序(不要说领导排在前面),假设我们的需求比较复杂。先进行姓排序,谁的姓拼音靠前,谁就排前面。然后对名字进行排序。恩.如果同名,女性排前头。如果名字和性别都相同,年龄小的排前头。ok,一个也不算复杂的需求。

如果对java比较熟悉的会知道java.util.Comparator 接口。要实现里面的函数
int compare(Object o1, Object o2) 返回一个基本类型的整型,返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。

于是我们设计的人员类要有几个变量,firstname,lastname,sex,age分别表示姓,名,性别,年龄。

public class Person {String firstname, lastname;Boolean sex;Integer age;public Person(String firstname, String lastname, Boolean sex, Integer age) {this.firstname = firstname;this.lastname = lastname;this.sex = sex;this.age = age;}public String getFirstName() {return firstname;}public String getLastName() {return lastname;}public Boolean getSex() {return sex;}public Integer getAge() {return age;}//为了输入方便,重写了toString()  public String toString() {return firstname + " " + lastname + " "+ (sex.booleanValue() ? "男" : "女") + " " + age;}}//end person  
下面是要实现比较器

public class MyComparators {public static Comparator<Object> getComparator() {return new Comparator<Object>() {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 compare((Person) o1, (Person) o2);} else {PR.pln("未找到合适的比较器");return 1;}}public int compare(String o1, String o2) {String s1 = (String) o1;String s2 = (String) o2;int len1 = s1.length();int len2 = s2.length();int n = Math.min(len1, len2);char v1[] = s1.toCharArray();char v2[] = s2.toCharArray();int pos = 0;while (n-- != 0) {char c1 = v1[pos];char c2 = v2[pos];if (c1 != c2) {return c1 - c2;}pos++;}return len1 - len2;}public int compare(Integer o1, Integer o2) {int val1 = o1.intValue();int val2 = o2.intValue();return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));}public int compare(Boolean o1, Boolean o2) {return (o1.equals(o2) ? 0: (o1.booleanValue() == true ? 1 : -1));}public int compare(Person o1, Person o2) {String firstname1 = o1.getFirstName();String firstname2 = o2.getFirstName();String lastname1 = o1.getLastName();String lastname2 = o2.getLastName();Boolean sex1 = o1.getSex();Boolean 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));}};}}

再尝试输出结果看看

package com.comparator;import java.util.Arrays;import com.study.PR;public class MyComparatorTest {/** * @param args */@SuppressWarnings("unchecked")public static void main(String[] args) {Person[] person = new Person[] {new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),new Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),};PR.pln("before sort:");for (int i = 0; i < person.length; i++) {PR.p( person[i]+"\t");}Arrays.sort(person, MyComparators.getComparator());PR.pln("\nafter sort:");for (int i = 0; i < person.length; i++) {PR.p( person[i]+"\t");}}}


仔细理解java的Comparator会给你写排序带来很大帮助


http://muscle-liu.iteye.com/blog/157261


原创粉丝点击