对象比较器之Comparabale

博客介绍了对象比较器,可对数据项比较大小和顺序。Arrays.sort方法能实现对象排序,着重讲解了Comparable接口,它可对实现类对象进行自然排序。还提到排序自定义People对象时,需该类继承Comparable接口并实现compareTo方法来自定义规则。

对象比较器

对两个或多个数据项进行比较,以确定它们是否相等,或确定它们之间的大小关系及排列顺序为比较。 

Arrays.sort方法可以实现对象的排序操作:

		//Arrays.sort()排序
		//排序规则 数字大小
		int[] s = {2,5,1,8,10,45,4};
		Arrays.sort(s);
		System.out.println(Arrays.toString(s));
		//排序规则 拼音首字母 由大到小
		String[] strs = {"贝贝","晶晶","欢欢","莹莹","妮妮"};
		Arrays.sort(strs);
		System.out.println(Arrays.toString(strs));

 

1.Comparabale

 此接口强行对实现它的每一个类的对象进行整体排序。这种排序被称为类的自然排序,类的comparaTo方法被称为它的自然排序方法。 

自定义People:

package com.lemon;
/**
 * 
 * @author lemonSun
 *
 * 2019年5月2日下午4:51:39
 */
public class People implements Comparable<People> {

	private String name;
	private int age;
	
	public People() {
		super();
	}
	public People(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 "People [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(People o) {
		//当前小于以前为真 从小到大排序
//		if(this.age > o.age) return 1;
//		if(this.age < o.age) return -1;
//		return 0;
		return this.age - o.age;
	}
	
	
}

测试:

	People[] p = {new People("贝贝",6),new People("欢欢",4),new People("妮妮",5)};
		
		Arrays.sort(p);
		System.out.println(Arrays.toString(p));

注意:排序自定义People对象,需要People类继承comparable接口,实现compareTo方法,在其中自定义排序规则

 

 

 

 

 

 

 

 

 

 

 

 

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)); } }; } }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值