集合中的對象比較

法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);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章