TreeSet的使用
文章目录
- 底层数据结构 : 红黑树
- 添加元素后的特点:可以按照添加的元素的指定的属性的大小顺序进行遍历
- 添加元素的要求: 添加到TreeSet的元素必须是同一个类型的对象,否则会报
ClassCastException
异常 - 添加的元素需要考虑到排序
- 自然排序
- 定制排序
判断数据是否相同的标准
- 不再是考虑
hashCode()
和equals()
方法,意味着添加到加到TreeSet中的元素不需要重写hashCode
和equals()
方法 - 比较元素大小或比较元素是否相等的标准就是考虑自然排序或定制排序,
compareTo()
或compare()
的返回值 - 如果
compareTo()
或compare()
返回值为0,则认为两个元素是相等的。由于TreeSet中不能存放相同的元素,则后一个相等的元素就不能添加到TreeSet中
添加 String 类型对象
public class TreeSetTest {
@Test
public void test1(){
TreeSet set = new TreeSet();
set.add("CC");
set.add("AA");
set.add("DD");
set.add("MM");
//set.add(123) 报错ClassCastException异常
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
//输出结果
AA
CC
DD
MM
添加自定义类型对象
//自定义类User
public class User implements Comparable{ //需要实现Comparable接口
String name;
int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
/**
* 按照年龄的从小到大进行排序
* @param o the object to be compared.
* @return
*/
// @Override
// public int compareTo(Object o) {
// if(this == o){
// return 0;
// }
// if(o instanceof User){
// User u = (User) o;
// return this.age - u.age;
// }
// throw new RuntimeException("类型不匹配");
// }
/**
* 先比较年龄,若年龄相同,则比较姓名,从大到小
* @param o the object to be compared.
* @return
*/
@Override
public int compareTo(Object o) { //需要重写compareTo方法,也就是自定义排序的方式
if(this == o){
return 0;
}
if(o instanceof User){
User u = (User)o;
int value = this.age -u.age;
if(value!=0){
return value;
}
return this.name.compareTo(u.name);
}
throw new RuntimeException("类型不匹配");
}
}
//测试
public class TreeSetTest{
public void test2(){
TreeSet set =new TreeSet();
User u1 = new User("Tom",23);
User u2 = new User("Jerry",43);
User u3 = new User("Rose",13);
User u4 = new User("Jack",23);
User u5 = new User("Tony",33);
set.add(u1);
set.add(u2);
set.add(u3);
set.add(u4);
set.add(u5);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
//输出结果
User{name='Rose', age=13}
User{name='Jack', age=23}
User{name='Tom', age=23}
User{name='Tony', age=33}
User{name='Jerry', age=43}
定制排序
new Comparator方法
public void test3() {
Comparator comparator = new Comparator() {
@Override
/*
按照姓名从小到大排列,若姓名相同,则比较age 从大到小排列
*/
public int compare(Object o1, Object o2) {
if(o1 instanceof User && o2 instanceof User){
User u1 = (User) o1;
User u2 = (User) o2;
int value = u1.getName().compareTo(u2.getName());
if(value != 0){
return value;
}
return -(u1.getAge() - u2.getAge());
}
throw new RuntimeException("类型不匹配");
}
};
TreeSet set = new TreeSet(comparator);
User u1 = new User("Tom",23);
User u2 = new User("Jerry",43);
User u3 = new User("Rose",13);
User u4 = new User("Jack",23);
User u5 = new User("Tony",33);
set.add(u1);
set.add(u2);
set.add(u3);
set.add(u4);
set.add(u5);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
//输出结果
User{name='Jack', age=23}
User{name='Jerry', age=43}
User{name='Rose', age=13}
User{name='Tom', age=23}
User{name='Tony', age=33}
标签:set,Java,name,age,add,User,使用,new,TreeSet
From: https://blog.csdn.net/qq_35899077/article/details/143259610