当前位置: 首页 > news >正文

Java中TreeSet的使用

TreeSet的使用

文章目录

  • TreeSet的使用
    • 判断数据是否相同的标准
            • 添加 String 类型对象
            • 添加自定义类型对象
            • 定制排序

  • 底层数据结构 : 红黑树
  • 添加元素后的特点:可以按照添加的元素的指定的属性的大小顺序进行遍历
  • 添加元素的要求: 添加到TreeSet的元素必须是同一个类型的对象,否则会报ClassCastException异常
  • 添加的元素需要考虑到排序
    • 自然排序
    • 定制排序

判断数据是否相同的标准

  • 不再是考虑hashCode()equals()方法,意味着添加到加到TreeSet中的元素不需要重写hashCodeequals()方法
  • 比较元素大小或比较元素是否相等的标准就是考虑自然排序或定制排序,compareTo()compare()的返回值
  • 如果compareTo()compare()返回值为0,则认为两个元素是相等的。由于TreeSet中不能存放相同的元素,则后一个相等的元素就不能添加到TreeSet中
添加 String 类型对象
public class TreeSetTest {@Testpublic 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;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic 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);}@Overridepublic 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*/@Overridepublic 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}

http://www.mrgr.cn/news/59119.html

相关文章:

  • JDK9——JDK13新特性总结
  • 三周精通FastAPI:14 表单数据和表单模型Form Models
  • ffmpeg视频滤镜:定向模糊-dblur
  • 【linux】ELKB安装token过期
  • C++ 中将 Lambda 作为参数传递给函数
  • 揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器
  • 代码随想录算法训练营第二十七天|Day27 贪心算法
  • 博图软件的使用(一)
  • 006:看图软件ACDSeePhotoStudio2019安装教程
  • Python中的Bloom Filter算法详解
  • C/C++(七)RAII思想与智能指针
  • Java-图书管理系统
  • 专题十六_栈_队列_优先级队列_算法专题详细总结
  • java核心技术点都有哪些
  • 【C++ 真题】B2099 矩阵交换行
  • 蓝桥杯第二十场小白入门赛
  • 走廊泼水节——求维持最小生成树的完全图的最小边权和
  • 010 操作符详解 上
  • MySQL数据库学习指南
  • RPA技术重塑企业自动化的未来
  • 数据结构之堆的实现以及性质和应用
  • 探寻闲鱼libsgmain加解密算法(3) ——libsgmainso-6.5.XX学习记录
  • 小白学视觉 | PE-YOLO:解决黑夜中的目标检测难点
  • 基于ESP8266的远程推力数据采集系统
  • 【Leecode】Leecode刷题之路第32天之最长有效括号
  • LeetCode 3180. 执行操作可获得的最大总奖励 I