我们首先了解一个TreeSet集合(也是一个可排序集合)
①底层是一个TreeMap的数据结构
②TreeMap底层是一个二叉树的数据结构
③放到TreeSet集合中的元素,等同于放到TreeMap集合key部分
④TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序下面
我们来看看第四条,究竟是怎么可排序的
要求:当年龄一样的时候,按照姓名的首字母排序
/*这里加泛型之后,下面的comparaTo方法才不会出现错误*/
/*这里的泛型和本类的类名相同,因为我们比较的是本类里面的部分属性*/
public class VIPCustomers implements Comparable<VIPCustomers> {
private int age;
private String name ;
@Override
public int compareTo(VIPCustomers vip) {
if(this.age ==vip.age){
/*当年龄一个样的时候,按姓名排*/
return this.name.compareTo(vip.name);
}else{
/*此时就是年龄排 升序排序 (反过来就是倒序排序)*/
return this.age-vip.age;
}
}
/* 一定要重写toString方法,不重写的话会使用原来的方法,返回对象的地址*/
@Override
public String toString() {
return "VIPCustomers{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
再穿件一个测试类
public class SortTest {
public static void main(String[] args) {
VIPCustomers v1 = new VIPCustomers(20,"张三");
VIPCustomers v2 = new VIPCustomers(19,"李四");
VIPCustomers v3 = new VIPCustomers(40,"赵六");
VIPCustomers v4 = new VIPCustomers(20,"王五");
TreeSet<VIPCustomers> t = new TreeSet<>();
t.add(v1);
t.add(v2);
t.add(v3);
t.add(v4);
Iterator<VIPCustomers> it = t.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
上述截图就是本次程序运行结果,
还有一种重要的方式就是使用一个比较器
/*比较器的联系*/
public class ComparatorTest {
public static void main(String[] args) {
TreeSet<VIPCustomers> vip = new TreeSet<>(new Comparator<VIPCustomers>() {
/*这里采用匿名内部类的方式 TreeSet的构造方法里面应该传入一个比较器的对象*/
/*这里比较推荐使用一个匿名内部类,当然新创建一个类也可以*/
@Override
public int compare(VIPCustomers vipCustomers, VIPCustomers t1) {
if(vipCustomers.getAge() == t1.getAge()){
/*如果年龄一个样的话就按照姓名排序*/
return vipCustomers.getName().compareTo(t1.getName());
}else {
return vipCustomers.getAge() - t1.getAge();
}
}
});
VIPCustomers v1 = new VIPCustomers(20,"张三");
VIPCustomers v2 = new VIPCustomers(19,"李四");
VIPCustomers v3 = new VIPCustomers(40,"赵六");
VIPCustomers v4 = new VIPCustomers(20,"王五");
vip.add(v1);
vip.add(v2);
vip.add(v3);
vip.add(v4);
Iterator<VIPCustomers> it = vip.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
最终的结果是一个样的
怎么选择这两种规则?
当比较规则不会发生变化或规则只有一个的时候,采用实现Comparable接口的方法
当比较规则频繁的发生变化或比较规则有多个的时候,采用Comparator接口的方法