首页 > 编程语言 >Java中TreeSet的使用

Java中TreeSet的使用

时间:2024-10-26 20:47:32浏览次数:3  
标签:set Java name age add User 使用 new TreeSet

TreeSet的使用

文章目录

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

判断数据是否相同的标准

  • 不再是考虑hashCode()equals()方法,意味着添加到加到TreeSet中的元素不需要重写hashCodeequals()方法
  • 比较元素大小或比较元素是否相等的标准就是考虑自然排序或定制排序,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

相关文章

  • 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现一
    一、前言介绍:1.1项目摘要随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势。古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力。然而,在现代社会中,由于生活节奏的加快和信息获取方式的多样化,古诗词的传播和阅读面临着一定的挑......
  • 高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
    如果有遗漏,评论区告诉我进行补充面试官:说一下JVM有哪些垃圾回收器?我回答:1.Serial收集器特点:Serial收集器是最古老、最稳定的收集器,它使用单个线程进行垃圾收集工作。在进行垃圾回收时,它会暂停所有用户线程,即StopTheWorld(STW)。单线程工作,适合单核CPU。在年......
  • 高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?
    如果有遗漏,评论区告诉我进行补充面试官:说一下JVM有哪些垃圾回收算法?我回答:在Java虚拟机(JVM)中,垃圾回收(GarbageCollection,GC)是一项非常重要的功能,用于自动管理应用程序的内存。JVM采用多种垃圾回收算法来决定何时以及如何回收不再使用的对象所占用的内......
  • pytest中使用selenium代码运行完后浏览器自动关闭
    遇到的问题在用selenium做web自动化测试时,测试用例执行完后,自动关闭浏览器ifcls.__driverisnotNoneandcls.__switchisFalse:cls.__driver.quit()cls.__driver=None在写代码的时候发现,就算设置了前后置,并且添加了判断已经创建了浏览器驱动实例,并且switch标......
  • JavaScript CSS Vue3 实现一个简单的Loading
    之前项目用到的,后来换其他效果了。放博客里保存一下。效果视频转GIF之后不太流畅……代码<scriptsetuplang="ts">import{onBeforeUnmount,onMounted,ref}from"vue";import{clamp}from"../scripts/Utils";constmaskDiv=ref<HTMLDivElement>(null)co......
  • C++/CLI使用Office.Interop库创建excel,同时解决写入速度慢的问题
    boolWriteExcelFile_OfficeInterop(String^path,DataSet^dt, conststd::vector<std::string>&sheetName,boolhideColumnName) { //Ifthefilealreadyexists,deleteitandthengeneratefile if(System::IO::File::Exists(path)) { try......
  • AGV电子地图之使用贝塞尔曲线画高级地图
    AGV电子地图之使用贝塞尔曲线画高级地图_哔哩哔哩_bilibili点击关注不迷路,你的关注是我们最大的动力。一个AGV地图的示例二、怎么用贝塞尔曲线画不规则形状三、示例代码 <PathStroke="Black"StrokeThickness="2"Fill="Transparent">   <Path.Data>   ......
  • Metasploit被控端与主控端的使用
    Metasploit被控端与主控端的使用确认IP地址首先我们先查看一下攻击机和靶机的ip地址攻击机ip:192.168.126.129靶机IP:125.217.53.83ps:后面电脑重启了,ip不一定对的上生成被控端我们先使用输入msfvenom命令生成一个payload,这是以下参数的解释:-p:使用反向远程控制程序“wind......
  • vue3使用ts和使用js
    1、使用ts<template> <divstyle="display:flex;margin:20px;"> <divstyle="width:20%;border:1pxsolidrgb(221221221);height:80vh;">1</div> <divstyle="width:60%;display:flex;justify-content:cen......
  • vue3监听和不能使用this问题,uniapp封装请求
    http.js//格式化日期函数exportfunctionrequest(method,url,data){consturls="http://183.6.96.231:29101"; constusername=uni.getStorageSync('username'); consttoken=uni.getStorageSync('token'); uni.showLoading({......