红黑树的概念
可以称之为二叉树,比根节点大的往又分叉,比根节点小的往左分叉,以此类推,可能会出现失去平衡的这种情况,那么就出现了我们的平衡二叉树
平衡二叉树:为了让二叉树平衡,就有了左旋和右旋,无论是左旋还是右旋,还是之前的那颗二叉树
二叉树的特点:就是大的在右,小的在左,会出现不平衡的情况,会有左旋和右旋
TreeSet底层是TreeMap,TreeMap底层是红黑树
TreeSet:自动默认自然排序,就是(12345,abcdefg等),限制为数字和英文的字符排序
引用数据类型排序会出现类型转换问题错误,要实现一个Comparable的接口,重写里面的一个comparaTo的方法,在里面写一个自定义的比较方式,接下来,我们来看一下代码
public static void method() {
Set set=new TreeSet();
set.add(23);
set.add(65);
set.add(17);
set.add(99);
System.out.println(set);
Set set2=new TreeSet();
set2.add("abc");
set2.add("bcd");
set2.add("cba");
set2.add("cab");
System.out.println(set2);
}
这个是我们的字母和数字用TreeSet的一个添加,那么对于默认的数字和字母的话,是友一个默认排序法的,这个默认排序法可以称为自然排序法,就是对我们的字母和数字,进行一个1234556789、abcdefg的这种默认排序
/*
* 引用数据类型排序
*/
public static void objMethod() {
Set set=new TreeSet();
set.add(new User(17,"小张"));
set.add(new User(18,"小赵"));
set.add(new User(19,"小黄"));
set.add(new User(17,"小黄"));
System.out.println(set);
}
引用数据类型排序呢,是先按照这个数字的前后顺序先排
要想在引用数据类型在Set里面存储内容的话,第一种方案就是用把实体类本身实现Comparable自定义规则
第二种方案就是在外部定义一个类实现Comparator接口,重写Compera
推荐用第二种方案,因为类本身是用来描述的,比较是额外添加的功能,应该单独写一个类里面
我们来看一下自定义比较器
```java
public static void customObjMethod() {
Set set=new TreeSet(new ComPareByPriceAndBrand());
set.add(new Item(6.6,"大刀肉","良品铺子"));
set.add(new Item(79.8,"坚果礼盒","baidu"));
set.add(new Item(1900,"ipad mini","apple"));
set.add(new Item(79.9,"坚果礼盒","alibaba"));
System.out.println(set);
当然这是我们new的一个对象,我们调用对象的有参构造器,在里面直接传参数,那么我们在创建红黑树的时候TreeSet(new ComPareByPriceAndBrand());,在里面直接new的这个对象,是我们在另外一个类里面写的比较器,可以直接在TreeSet里面
调用
```java
@Override
public int compare(Object o1, Object o2) {
Item item=(Item)o1;
Item item2=(Item)o2;
//先比较价格
double temp=item.getPrice() - item2.getPrice();
// double temp =
//判断价格是否相等,如果相等就根据商家名字进行排序
if(temp<0) {
return (int)Math.floor(temp);
}
else if(temp==0) {
return item.getBrand().compareTo(item2.getBrand());
}else {
return (int)Math.ceil(temp);
}
而我们要先实现一个接口,只有实现了这个接口,我们才能自定义一个比较器,而我们实现的接口是这个implements Comparator
然后冲写了里面的compare方法,当然这是我们比较器的第二方法,里面先比较价格,如果价格相等,再比较商家名称,按商家名
称进行排序,如果商品价格不一样的话,那就不用再往下比较了,可以直接排序,我比较推荐大家使用第二种方法来写比较器