12、TreeSet实现类
TreeSet实现类是set的另一个实现类,前面我们讲了一个HashSet。那现在让我们来看看什么是TreeSet
(1)基本概念
- 基于排序顺序实现不重复
- 实现SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,指定排序规则
- 通过CompareTo方法确定是否为重复元素
(2)TreeSet的简单使用
package ch09_set;
import java.util.Iterator;
import java.util.TreeSet;
/**
* TreeSet的使用
* 存储结构:红黑树
* @author 18902
* @date 2021/3/16 21:07
*/
public class Demo2 {
public static void main(String[] args) {
//创建集合
TreeSet<String> treeSet=new TreeSet<> ();
//添加元素
treeSet.add ("abc");
treeSet.add ("xyz");
treeSet.add ("hello");
System.out.println ("元素个数:"+treeSet.size ());
System.out.println (treeSet.toString ());
//删除元素
// treeSet.remove ("abc");
// System.out.println ("删除之后:"+treeSet.size ());
//遍历()使用增强for
for(String string:treeSet){
System.out.println (string);
}
//使用迭代器
Iterator iterator=treeSet.iterator ();
while (iterator.hasNext ()){
System.out.println (iterator.next ());
}
//判断
System.out.println (treeSet.contains ("abc"));
}
}
(3)TreeSet保存数据的使用(Person类实现Comparable)
package ch09_set;
import java.util.TreeSet;
/**
* 使用TreeSet保存数据
* 存储结构:红黑树
* @author 18902
* @date 2021/3/16 21:44
*/
public class Demo3 {
public static void main(String[] args) {
//创建集合
TreeSet<Person> treeSet=new TreeSet<> ();
//添加元素
Person p1=new Person ("l",10);
Person p2=new Person ("y",30);
Person p3=new Person ("m",20);
treeSet.add (p1);
treeSet.add (p2);
treeSet.add (p3);
System.out.println ("元素个数:"+treeSet.size ());
}
}
当我们运行时会发现报下面的错误:
Exception in thread "main" java.lang.ClassCastException: ch09_set.Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at ch09_set.Demo3.main(Demo3.java:21)
这个是指类型转换异常来着。由于TreeSet的存储结构时红黑树(二叉查找树,左边节点都比右边节点要小【与根节点比较】 ),那么元素就必须要实现Comparable接口
- Person实现Comparable接口
//先按照姓名进行比较,再按照年龄进行比较
@Override
public int compareTo(Person o) {
int n1=this.getName ().compareTo (o.getName ());
int n2=this.getAge ()-o.getAge ();
return n1==0?n2:n1;
}
这个时候我们再来运行会发现不报错了:
- 测试类
package ch09_set;
import java.util.Iterator;
import java.util.TreeSet;
/**
* 使用TreeSet保存数据
* 存储结构:红黑树
* @author 18902
* @date 2021/3/16 21:44
*/
public class Demo3 {
public static void main(String[] args) {
//创建集合
TreeSet<Person> treeSet=new TreeSet<> ();
//添加元素
Person p1=new Person ("l",10);
Person p2=new Person ("y",30);
Person p3=new Person ("m",20);
treeSet.add (p1);
treeSet.add (p2);
treeSet.add (p3);
System.out.println ("元素个数:"+treeSet.size ());
System.out.println (treeSet.toString ());
//删除
treeSet.remove (p1);
System.out.println (treeSet.size ());
//遍历增强for
for(Person person:treeSet){
System.out.println (person);
}
//迭代器
Iterator<Person> iterator=treeSet.iterator ();
while (iterator.hasNext ()){
System.out.println (iterator.next ());
}
//判断
System.out.println (treeSet.contains (p1));
}
}
(4)TreeSet的Comparator接口使用
reeSet也提供了一个带比较器Comparator的构造方法,使用匿名内部类来实现它:
- 代码实现
package ch09_set;
import java.util.Comparator;
import java.util.TreeSet;
/**
* TreeSet的使用
* Comparator:实现定制比较(比较器):自己定制比较规则
* Comparable:是可比较的
* @author 18902
*
*/
public class Demo4 {
public static void main(String[] args) {
//在创建集合时 就指定比较规则
TreeSet<Person> treeSet=new TreeSet<> (new Comparator<Person> () {
@Override
public int compare(Person o1, Person o2) {
int n1=o1.getAge ()-o2.getAge ();
int n2=o1.getName ().compareTo (o2.getName ());
return n1==0?n1:n2;
}
});
//添加元素
Person p1=new Person ("l",10);
Person p2=new Person ("y",30);
Person p3=new Person ("m",20);
treeSet.add (p1);
treeSet.add (p2);
treeSet.add (p3);
System.out.println (treeSet.toString ());
}
}
- 先按照年龄进行比较,再按照姓名进行比较
(5)TreeSet案例
package ch09_set;
import java.util.Comparator;
import java.util.TreeSet;
/**
* 使用TreeSet集合实现字符串按照长度进行排序
* Comparator接口实现定制比较
* @author 18902
* @date 2021/3/16 23:17
*/
public class Demo5 {
public static void main(String[] args) {
TreeSet<String> treeSet=new TreeSet<> (new Comparator<String> () {
@Override
public int compare(String o1, String o2) {
int n1= o1.length ()-o2.length ();
int n2=o1.compareTo (o2);
return n1==0?n2:n1;
}
});
treeSet.add ("helloWorld");
treeSet.add ("lym");
treeSet.add ("yummy");
treeSet.add ("lisi");
treeSet.add ("zhangsan");
treeSet.add ("000613");
//直接打印
System.out.println (treeSet.toString ());
}
}
(6)总结
最后做了一个脑图总结一下
♥set集合大概就到这里啦♥