JAVA对象比较器Comparator

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。
如将下列数字进行排序
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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值