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

集合框架14:TreeSet概述、TreeSet使用、Comparator接口及举例

视频链接:13.29 TreeSet概述_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://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());
    }
}


http://www.kler.cn/news/358201.html

相关文章:

  • 数据清洗(脚本)
  • 【Linux】从多线程同步到生产者消费者模型:多线程编程实践
  • 零代码快速开发智能体 |甘肃旅游通
  • 【str_replace替换导致的绕过】
  • Windows和Linux在客户端/服务端在安全攻防方面的区别
  • 路由表来源(基于华为模拟器eNSP)
  • web前端--html 5---qq注册
  • 基于SpringBoot+Vue+MySQL的社区医疗管理系统
  • 【linux】GCC 7和GCC 8版本不再包含在默认的软件仓库中
  • hi3798mv100 linux 移植
  • Rocky Linux 9安装后无法远程ssh密码登录解决
  • 网盘直链下载神器NDM
  • MySQL数据库:基础介绍下载与安装
  • Unity中通过给定的顶点数组生成凸面体的方法参考
  • quic-go源码二---server accept请求
  • 【Linux】system V进程间通信--共享内存,消息队列,信号量
  • 服务器运维监控平台
  • 数据结构和算法的常见面试题
  • kernel32.dll下载地址:如何安全地恢复系统文件
  • rk3568 android11 单独烧写内核。