自定义类型的排序
放到TreeSet或者TreeMap集合key部分的元素要想做到排序,包括两种方式:
- 第一种:放在集合中的元素实现java .lang. Comparable接口。
- 第二种:在构造TreeSet或者TreeMap集合的时候给它传一个比较器对象。
1.实现Comparable接口:
实现Comparable接口,并且实现compareTo方法,需要在这个方法中编写比较的逻辑,或者说比较的规则,按照什么进行比较!
public class Test2 {
public static void main(String[] args) {
Person p=new Person(11);
Person p1=new Person(8);
Person p2=new Person(17);
Person p3=new Person(12);
TreeSet<Person> s=new TreeSet<>();
s.add(p);
s.add(p1);
s.add(p2);
s.add(p3);
for(Person pe:s) {
System.out.println(pe);
}
}
}
class Person implements Comparable<Person>{
int age;
public Person(int age){
this.age=age;
}
@Override
public int compareTo(Person o) {
return this.age-o.age;//比较规则最终还是由程序员指定的
//:例如按照年龄升序。
}
public String toString(){
return "年龄"+age;
}
}
2.给构造方法传递一个比较器:
创建TreeSet集合的时候,使用Comparator这个比较器。给构造方法传递一个比较器。
public class Test2 {
public static void main(String[] args) {
Person p=new Person(11);
Person p1=new Person(8);
Person p2=new Person(17);
Person p3=new Person(12);
//匿名内部类
TreeSet<Person> s=new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age-o2.age;
}
});
s.add(p);
s.add(p1);
s.add(p2);
s.add(p3);
for(Person pe:s) {
System.out.println(pe);
}
}
}
class Person {
int age;
public Person(int age){
this.age=age;
}
public String toString(){
return "年龄"+age;
}
}
Comparable利Comparator怎么选择呢?
1.当比较规则不会发生改变的时候,或者说当比较规则只有1个的时候,建议实现comparable接口。
2.如果比较规则有多个,并且需要多个比较规则之间频繁切换,建议使用comparator接口。Comparator接口的设计符合OCP原则。