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