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