TreeSet中的比较器问题
TreeSet的比较器只有在泛型类型为系统定义好的数据类型时,才有给定的比较器,且默认为升序,其余情况均要通过处理。
1.TreeSet的降序排序实现:
此时需要我们重写Comparator的接口
代码实现:
1 public static void TreeSetDesc()//实现降序 2 { 3 TreeSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>() {//设置自定义的比较器 4 public int compare(Integer o1,Integer o2)//改变compare函数来改变比较器的比较规则 5 { 6 return -(o1 - o2); 7 } 8 } 9 ); 10 11 set.add(234); 12 set.add(588); 13 set.add(30); 14 15 System.out.println(set); 16 }
2.TreeSet的自定义类的排序实现
(1).法一:重写比较器(和上述代码类似)
1 public static void TreeSetPerson() 2 { 3 TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() { 4 public int compare(Person p1,Person p2) 5 { 6 return p1.getAge() - p2.getAge(); 7 } 8 }); 9 set.add(new Person("张三",40)); 10 set.add(new Person("李四",30)); 11 set.add(new Person("王五",50)); 12 System.out.println(set); 13 }
(2).法二:在类中定义比较的方式
类中定义比较方式代码:
1 public class Person implements Comparable<Person>{//引入比较器接口 2 //定义比较函数 3 public int compareTo(Person p) {//此处比较两个量,一个量是p,另一个量是自身this 4 return this.age - p.age; 5 } 6 }
然后就可以把类当作普通的Integer等类型进行操作即可
1 public static void TreeSetPerson() 2 { 3 TreeSet<Person> set = new TreeSet<>(); 4 set.add(new Person("张三",40)); 5 set.add(new Person("李四",30)); 6 set.add(new Person("王五",50)); 7 System.out.println(set); 8 }