有Person类如下:
1 classPerson {2 String name;3 intage;4 String address;5 }
有main如下:
1 importjava.util.TreeSet;2
3 public classTest{4 public static voidmain(String[] args){5 Person p1 = new Person("AA",18,"CN");6 Person p2 = new Person("BB",18,"JP");7 Person p3 = new Person("CC",18,"CN");8
9 TreeSet persons = new TreeSet<>();10 persons.add(p1);11 persons.add(p2);12 persons.add(p3);13 for(Object person : persons) {14 System.out.println(person);15 }16 }17 }
由于TreeSet为可排序集合,所以要为存放对象(Person)指定排序规则。
排序规则:ASC(升序),age > address > name
故重写Person的compareTo():
1 public intcompareTo(Person o) {2 if(this.age >o.age){3 return 1;4 }else if(this.age
8 int x = this.address.compareTo(o.address);9 if(x != 0){10 returnx;11 }12 //判断address谁大,若相等,则判断name
13 return this.name.compareTo(o.name);14 }
注:若要DESC排序:
1、age比较中交换1/-1;
2、address比较中return相反数值;
3、name比较中return相反数值;
上述代码的逻辑顺序:
传入比较对象o与自身进行对比;
若this.age > o.age,返回“1”;
若this.age < o.age,返回“-1”;
若相等,比较address;
令x = this.address.compareTo(o.address);
若x != 0,即不相等,x即为要返回的值(1/-1);
若x == 0,即相等,比较name;
this.name.compareTo(o.name)的值即为要返回的值:
若值为 1,即大于,
若值为-1,即为小于,
若值为 0,即三处均相等,则完全相等,不应存入。
完整代码:
1 packagetoBKY;2
3 importjava.util.TreeSet;4
5 public classTest{6 public static voidmain(String[] args){7 Person p1 = new Person("AA",18,"CN");8 Person p2 = new Person("BB",18,"JP");9 Person p3 = new Person("CC",18,"CN");10
11 TreeSet persons = new TreeSet<>();12 persons.add(p1);13 persons.add(p2);14 persons.add(p3);15
16 for(Object person : persons) {17 System.out.println(person);18 }19 //使用for each 比Iterator代码量少
20
21 }22 }23
24 class Person implements Comparable{25 String name;26 intage;27 String address;28
29 public Person(String name, intage, String address) {30 this.name =name;31 this.age =age;32 this.address =address;33 }34
35 @Override36 publicString toString() {37 return "Person{" +
38 "name='" + name + '\'' +
39 ", age=" + age +
40 ", address='" + address + '\'' +
41 '}';42 }43
44 @Override45 public intcompareTo(Person o) {46 if(this.age >o.age){47 return 1;48 }else if(this.age
52 int x = this.address.compareTo(o.address);53 if(x != 0){54 returnx;55 }56 //判断address谁大,若相等,则判断name
57 return this.name.compareTo(o.name);58 }59 }