集合框架14:TreeSet概述、TreeSet使用、Comparator接口及举例
视频链接:13.29 TreeSet概述_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from=333.788.videopod.episodes&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5&p=29
1、TreeSet概述
- 基于排列顺序实现元素不重复;
- 实现了SortedSet接口,对元素集合自动排序;
- 元素的接口必须实现Comparable接口,指定排序规则;
- 通过comparaTo 方法确定元素是否为重复;
2.TreeSet添加基本类型元素使用举例
package com.yundait.demo02;import java.util.Iterator;
import java.util.TreeSet;public class TreeSetDemo01 {public static void main(String[] args) {//创建TreeSet集合TreeSet<String> strings = new TreeSet<>();//1添加元素strings.add("xyz");strings.add("abc");strings.add("beijing");//strings.add("xyz");//不能添加重复元素System.out.println(strings.size());System.out.println(strings.toString());//2删除元素//strings.remove("xyz");System.out.println(strings.size());//3遍历集合元素for (String string : strings) {System.out.println(string);}System.out.println("-----------------");Iterator<String> iterator = strings.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}//4判断System.out.println("-----------------");System.out.println(strings.contains("beijing"));System.out.println(strings.isEmpty());}
}
3.TreeSet集合添加引用类型元素举例
package com.yundait.demo02;import java.util.Iterator;
import java.util.TreeSet;/**** 使用TreeSet保存数据*村存储结构:红黑树;* 要求:元素必须要实现Comparable接口,当compareTo方法返回值为0,则认为是重复元素;*/public class TreeSetDemo02 {public static void main(String[] args) {//创建集合TreeSet<Person> people = new TreeSet<>();//1添加元素Person p1 = new Person("abc", 20);Person p2 = new Person("xyz", 20);Person p3 = new Person("nanjing", 20);Person p4 = new Person("nanjing", 19);Person p5 = new Person("nanjing", 19);people.add(p1);people.add(p2);people.add(p3);people.add(p4);people.add(p5);//因为compareTo方法返回值为0,认为是重复元素,不能添加System.out.println("集合元素的个数为:" + people.size());System.out.println(people.toString());//2删除元素//people.remove(p1);//people.remove(new Person("abc",20));//因为重写了comparable方法,所以以上两种删除方式都可以实现;System.out.println(people.toString());System.out.println("删除后元素的个数为:" + people.size() );//3遍历集合//3.1使用增强for循环for(Person person : people){System.out.println(person);}//3.2使用迭代器System.out.println("---------------------");Iterator<Person> iterator = people.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}//4判断System.out.println(people.isEmpty());System.out.println(people.contains(new Person("nanjing", 19)));}
}
想要添加成功元素需要实现Comparable接口,重写接口中的compareTo 方法
public class Person implements Comparable<Person> {//元素实现Comparable接口private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Person)) return false;Person person = (Person) o;return getAge() == person.getAge() && Objects.equals(getName(), person.getName());}@Overridepublic int hashCode() {return Objects.hash(getName(), getAge());}@Override//重写comparaTo方法public int compareTo(Person o) {int n1 = this.getName().compareTo(o.getName());int n2 = this.age - o.age;return n1 == 0 ? n2 : n1;}
}
4.Comparator接口
package com.yundait.demo02;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo03 {public static void main(String[] args) {TreeSet<Person> people = new TreeSet<>(new Comparator<Person>() {//创建集合时,使用匿名内部类实现Comparator接口重写接口中的compare方法,自定义比较规则@Overridepublic int compare(Person o1, Person o2) {int n1 = o1.getAge() - o2.getAge();int n2 = o1.getName().compareTo(o2.getName());return n1 == 0 ? n2 : n1;}});Person p1 = new Person("abc", 28);Person p2 = new Person("xyz", 15);Person p3 = new Person("nanjing", 29);Person p4 = new Person("nanjing", 15);people.add(p1);people.add(p2);people.add(p3);people.add(p4);System.out.println(people.toString());}
}
5.小案例
/*** 案例需求:使用TreeSet集合实现字符串元素按照长度进行排序* Comparator接口实现比较;*/
public class TreeSetDemo04 {public static void main(String[] args) {TreeSet<String> strings = new TreeSet<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int n1 = o1.length() - o2.length();int n2 = o1.compareTo(o2);return n1==0?n2:n1;}});strings.add("HelloWorld");strings.add("pingguo");strings.add("lisi");strings.add("zhangsan");strings.add("beijing");strings.add("cat");strings.add("nanjing");strings.add("xian");System.out.println(strings.toString());}
}