集合框架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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public 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());
}
@Override
public 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方法,自定义比较规则
@Override
public 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>() {
@Override
public 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());
}
}