TreeSet的另一种实现自定义排序:实现比较器接口
1、使用TreeSet的有参数构造方法,传一个指定的比较器对象。
Comparable接口和Comparator接口怎么选择呢?到底用哪个好?
当比较规则不会发生改变的时候,或者说当比较规则只有1种的时候,建议实现Comparable接口。
比较规则有多种,并且需要多个规则之间来回切换,建议实现Comparator接口。
其中Comparator接口的设计符合OCP原则。
假设有一个Customer类,待比较的对象:
class Customer {
int age;
String name;
public Customer() {
}
public Customer(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return age + "-" + name;
}
}
设计比较器对象,实现java.util.Comparator接口:
class CustomComparator implements Comparator<Customer> {
@Override
public int compare(Customer o1, Customer o2) {
// 年龄相同按照名字升序
if (o1.age == o2.age) {
return o1.name.compareTo(o2.name);
} else { // 年龄不相同
return o1.age - o2.age; // 按照年龄升序
}
}
}
测试代码:
import java.util.*;
public class Test09 {
public static void main(String[] args) {
// 创建TreeSet对象
//Set<Customer> customs = new TreeSet<>(new CustomComparator());
// 也可以使用匿名内部类,直接new接口
Set<Customer> customs = new TreeSet<>(new Comparator<Customer>() {
@Override
public int compare(Customer o1, Customer o2) {
// 年龄相同按照名字升序
if (o1.age == o2.age) {
return o1.name.compareTo(o2.name);
} else { // 年龄不相同
return o1.age - o2.age; // 按照年龄升序
}
}
});
// 添加Customer对象
customs.add(new Customer(30, "zhangyi"));
customs.add(new Customer(25, "zhanger"));
customs.add(new Customer(20, "zhangsan"));
customs.add(new Customer(20, "liyi"));
customs.add(new Customer(25, "lier"));
customs.add(new Customer(30, "lisan"));
// 遍历集合
for (Customer c : customs) {
System.out.print(c + " "); //20-liyi 20-zhangsan 25-lier 25-zhanger 30-lisan 30-zhangyi
}
System.out.println();
/*
所以存到TreeSet集合中的元素要想做到排序,有2种方法:
第一种:元素类实现java.lang.Comparable接口,重写比较规则。
第二种:在TreeSet的有参数构造方法中传一个比较器对象。
* */
}
}