Tree
TreeSet
- TreeSet的底层就是TreeMap
- TreeSet练习
- TreeSet可以进行排序
package com.lyc._Tree;
import java.util.Comparator;
import java.util.TreeSet;
public class treeSet01 {
public static void main(String[] args) {
//笔记
//1.当我们使用无参构造器来创建treeSet时,仍然是无序的
//2.我们希望添加的元素,按照字符串大小来排序时
//3.使用treeSet提供的一个构造器,可以传入一个比较器,(匿名内部类)
//并指定排序规则
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//将o1 o2转型为 String类型,这样就可以调用String的compareTo方法,让两个字符串进行比较
//return ((String)o2).compareTo((String) o1);
//如果我们想要按照字符串的长度从小到大排列
return ((String)o2).length() -((String)o1).length();
}
});
treeSet.add("a");
treeSet.add("bb");
treeSet.add("ccc");
treeSet.add("dddd");
//如果我门在比较字符串长度的情况下,在添加一个长度为3的字符串,这时是加不进去的,因为构造方法中的比较规则就是长度比较,此时已有长度为3的字符串
//再继续添加同长度的子符串,就会返回空,就不会添加
//如果再把比较规换成,比较字符,就可以正常添加,因为treeSet中并没有与abc相同的字符串
treeSet.add("abc");
System.out.println(treeSet);
}
}
- 源码解读
1.构造器把传入的比较对象,赋给了treeSet底层的TreeMap的属性this.comparator
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
2.在调用 treeSet.add()方法时,在底层会执行下面代码
Comparator<? super K> cpr = comparator;
if (cpr != null) {//这就是我们的匿名内部类对象
do {
parent = t;
cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类(对象),compare
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else//如果相等,即返回0,这个key就没有加入
return t.setValue(value);
} while (t != null);
}
TreeMap
注意:key可以为null,但是前提是自定义了Comparator,然后里面处理了空指针引用的异常!!!不是TreeMap不支持null,而是String的compareTo不支持,实现一个支持null的比较器就可以了!!
//比较方式的源码
Comparator<? super K> cpr = comparator;
if (cpr != null) {//这就是我们的匿名内部类对象
do {
parent = t;
cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类(对象),compare,
//此时我们对比对象不再使用equals方法,而是我们的compare方法来决定的
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else//如果相等,即返回0,这个key就没有加入,当compare方法对比长度时,相同长度就会被认为是相同的对象,就不会加入
return t.setValue(value);
} while (t != null);
}
package com.lyc._Tree;
import sun.reflect.generics.tree.Tree;
import java.util.Comparator;
import java.util.TreeMap;
public class TreeMap_ {
public static void main(String[] args) {
//使用默认构造器创建,默认认为排序规则为,key的首字母排序,因为String实现了Comparator
//TreeMap treeMap = new TreeMap();
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//若果我们想要降序排序了
return ((String)o2).compareTo((String)o1);
//若是想按照key 的长度进行排序,注意如果按照长度排序的话,出现相同长度时,后加入的会加入失败
//return ((String)o1).length() - ((String)o2).length();
}
});
treeMap.put("cde","水浒");
treeMap.put("a","红楼");
treeMap.put("e","西游");
treeMap.put("bc","三国");
treeMap.put("cdef","聊斋");
treeMap.put("a","黄梅戏");//注意treeMap中当出现相同key值时,value会被替换
System.out.println(treeMap);
}
}