集合中的对象比较

法1:

类继承Compare<T>接口

import lombok.Data;

@Data
public class UserTest implements Comparable<UserTest> {
	private int age;

	public int compareTo(UserTest o) {
		// TODO Auto-generated method stub
		return age-o.age;
	}

}

有局限性,对于给定的一个类只能实现这个接口一次 若一个集合要按照编号排序另一个集合却要按照描述排序 或者一个类没有继承comparable接口怎么办?

所以要用到法2

法2:利用Comarable接口

@Data
public class UserTest implements Comparable<UserTest> {
	private int age;
	private String name;
	public UserTest(int age,String name){
		this.age=age;
		this.name=name;
	}
	public int compareTo(UserTest o) {
		return Integer.compare(age, o.age);
	}
/*	public int hashCode(){
		return 	Objects.hash(name,age);
	}
	public String toString(){
		return "[name="+this.name+",age="+this.age+"]";
	}
	public boolean equals(Object otherObject){
		if(this==otherObject) return true;
		if(otherObject==null) return false;
		if(getClass()!=otherObject.getClass()) return false;
		UserTest other=(UserTest) otherObject;
		return Objects.equals(name,other.name)&& age==other.age;
	}*/
}
 SortedSet<UserTest> parts=new TreeSet<UserTest>();
    	 parts.add(new UserTest(16,"fitch"));
    	 parts.add(new UserTest(13,"figch"));
    	 parts.add(new UserTest(14,"fitch3"));
    	 parts.add(new UserTest(20,"fiqch"));
    	 System.out.println(parts);//TreeSet 有序集合自动按照年龄
    	SortedSet<UserTest> sortbyname=new TreeSet<UserTest>(new Comparator<UserTest>(){
			public int compare(UserTest o1, UserTest o2) {
				return o1.getName().compareTo(o2.getName());
			}
    	});
    	sortbyname.addAll(parts);
    	System.out.println(sortbyname);//按照名字排序

也可以将comparator写成一个类

public class ItemComparator implements Comparator<UserTest>{
	public int compare(UserTest o1, UserTest o2) {
		return o1.getName().compareTo(o2.getName());
	}
}
ItemComparator com=new ItemComparator();
......
SortedSet<UserTest> sortbyname=new TreeSet<UserTest>(com);

法3:

利用工具类Collections.sort

ItemComparator com=new ItemComparator();
    	 List<UserTest> parts=new ArrayList<UserTest>();
    	 parts.add(new UserTest(13,"fitch"));
    	 parts.add(new UserTest(13,"fimgch"));
    	 parts.add(new UserTest(14,"fitch3"));
    	 parts.add(new UserTest(20,"fiqch"));
    	 Collections.sort(parts);
    	 System.out.println(parts);//按照age
    	 Collections.reverse(parts);
    	 System.out.println(parts);//按照age倒叙
    	 Collections.sort(parts,com);//按照名字
    	 System.out.println(parts);
    	 Collections.sort(parts,Collections.reverseOrder(com));//按照名字倒叙
    	 
    	 System.out.println(parts);

如果想要先比较名字 在名字相同的情况下比较年龄

public int compareTo(UserTest o) {
		//return Integer.compare(age, o.age);
		return new CompareToBuilder().append(name,o.getName()).append(age, o.getAge()).toComparison();
	}

在UserTest里的compareTo方法要写成上面那样。上面的CompareToBuilder要引用Apache Commons Lang

然后在用

Collections.sort(parts);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值