Java-对象比较器

Java对象比较详解

在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口。String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现了Comparable<T>接口。如果要比较的对象没有实现Comparable接口或Comparator接口而直接比较会报 java.lang.ClassCastException类型转换异常。

两个对象进行比较方法一:实现Comparable<T>接口

Person类是要比较的对象

package com.lym.comparator;
/**
 * 人类
 * 要使该类能进行比较,该类必须实现Comparable接口
 * @author Administrator
 *
 */
public class Person implements Comparable<Person>{

	private String name;
	private int age;
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	//当前类按年龄由小到大排序
	//1和-1调换后就是按年龄由大到小排序的
	@Override
	public int compareTo(Person o) {
		if(o == null){
			throw new NullPointerException();
		}
		if(this.age>o.age){
			return 1;
		}else if(this.age<o.age){
			return -1;
		}
		return 0;//相等
	}
	
}
方法二:实现Comparator<T>接口

实现Comparator<T>接口与Comparable<T>接口有什么区别吗?

答:Comparable<T>接口 是在要比较的对象类创建的时候就实现了,也就是在项目上线之前就设计好了,大多数时候是采用这种方法。但是,有的时候项目已经上线了,此时我们还要对某个类进行比较,而此时该类还没有实现Comparable<T>接口,为了遵守软件开发中“对扩展开放,对修改关闭”的原则,我们可以再定义一个比较器类,实现Comparator<T>接口,这样我们就不会破坏要比较的类的原有结构了。

自定义比较器类

package com.lym.comparator;

import java.util.Comparator;

/**
 * 自定义比较器类
 * 
 * @author Administrator
 * 
 */
public class ComparatorDemo implements Comparator<Person2> {

	@Override
	public int compare(Person2 o1, Person2 o2) {
		if (o1 == null || o2 == null) {
			throw new NullPointerException();// 空指针异常
		}
		if (o1.getAge() > o2.getAge()) {
			return 1;
		} else if (o1.getAge() < o2.getAge()) {
			return -1;
		}
		return 0;
	}

}

Person2类

package com.lym.comparator;

/**
 * 人类
 * 
 * @author Administrator
 * 
 */
public class Person2 {

	private String name;
	private int age;

	public Person2() {
		super();
	}

	public Person2(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person2 [name=" + name + ", age=" + age + "]";
	}

}



对象比较器测试类

package com.lym.comparator;

import java.util.Arrays;

/**
 * 对象比较器测试类
 * @author Administrator
 *
 */
public class ComparableDemo {

	public static void main(String[] args) {
		String[] names = {"利亚","藤兰","泉彩","井空","岛爱","结衣"};
		
		Person[] persons = {
				new Person("泉彩",23),new Person("岛爱",25),
				new Person("藤兰",41),new Person("结衣",35),
				new Person("利亚",28),new Person("井空",32)
		};
		
		Person2[] persons2 = {
				new Person2("泉彩",23),new Person2("岛爱",25),
				new Person2("藤兰",41),new Person2("结衣",35),
				new Person2("利亚",28),new Person2("井空",32)
		};
		
		Arrays.sort(names);
		System.out.println(Arrays.toString(names));
		
		//实现Comparable<T>接口
		Arrays.sort(persons);//按Person对象的age属性比较大小
		System.out.println(Arrays.toString(persons));//输出比较后的对象数组
		
		//自定义比较器,实现Comparator<T>接口
		Arrays.sort(persons2);
		System.out.println(Arrays.toString(persons2));
	}

}



转载于:https://www.cnblogs.com/liuyanmin/p/5146534.html

public class Comparators { public static java.util.Comparator getComparator() { return new java.util.Comparator() { 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 { System.err.println("未找到合适的比较器"); 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)); } }; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值