Day10-Java进阶-泛型数据结构(树)TreeSet 集合

1. 泛型

1.1 泛型介绍

package com.itheima.generics;

import java.util.ArrayList;
import java.util.Iterator;

public class GenericsDemo1 {
    /*
        泛型介绍 : JDK5引入的, 可以在编译阶段约束操作的数据类型, 并进行检查

        注意 : 泛型默认的类型是Object, 且只能接引用数据类型

        泛型的好处:
                    1. 统一数据类型
                    2. 将运行期的错误提升到了编译期

        泛型的学习路径:
                    1. 泛型类
                    2. 泛型方法
                    3. 泛型接口
                    4. 泛型通配符
                    5. 泛型的限定
     */
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");

        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object o = it.next();
            String s = (String) o;
            System.out.println(s.length());
        }
    }
}

1.2 泛型类

package com.itheima.generics;

import java.util.ArrayList;

public class GenericsDemo2 {
    /*
        常见的泛型标识符 : E V K T

            E : Element
            T : Type
            K : Key(键)
            V : Value(值)

        清楚不同的泛型, 在什么时机能确定到具体的类型

        泛型类 : 创建对象的时候
     */
    public static void main(String[] args) {
        Student<Integer> stu = new Student<>();

    }
}

class Student<E> {

    private E e;

    public E getE() {
        return e;
    }

    public void setE(E e) {
        this.e = e;
    }
}

1.3 泛型方法

package com.itheima.generics;

public class GenericsDemo3 {
    /*
        泛型方法
                1. 非静态的方法 : 内部的泛型, 会根据类的泛型去匹配
                2. 静态的方法 : 静态方法中如果加入了泛型, 必须声明出自己独立的泛型
                                    - 时机: 在调用方法, 传入实际参数的时候, 确定到具体的类型
     */
    public static void main(String[] args) {

        String[] arr1 = {"张三", "李四", "王五"};
        Integer[] arr2 = {11, 22, 33};
        Double[] arr3 = {11.1, 22.2, 33.3};

        printArray(arr1);
        printArray(arr2);
        printArray(arr3);

    }

    public static <T> void printArray(T[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length - 1; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println(arr[arr.length - 1] + "]");
    }
}

1.4 泛型接口

package com.itheima.generics;

import java.util.ArrayList;
import java.util.List;

public class GenericsDemo4 {
    /*
        泛型接口
            1. 实现类, 实现接口的时候确定到具体的泛型
            2. 实现类实现接口, 没有指定具体类型, 就让接口的泛型, 跟着类的泛型去匹配
     */
    public static void main(String[] args) {
        InterBIml<String> i = new InterBIml<>();
    }
}

interface Inter<E> {
    void show(E s);
}

class InterAIml implements Inter<String>{

    @Override
    public void show(String s) {

    }
}

class InterBIml<E> implements Inter<E>{

    @Override
    public void show(E e) {

    }
}

1.5 泛型通配符

package com.itheima.generics;

import java.util.ArrayList;

public class GenericsDemo5 {
    /*
        泛型通配符

                ? : 任意类型

                ? extends E : 可以传入的是E, 或者是E的子类

                ? super E : 可以传入的是E, 或者是E的父类
     */
    public static void main(String[] args) {

        ArrayList<Coder> list1 = new ArrayList<>();
        list1.add(new Coder());

        ArrayList<Manager> list2 = new ArrayList<>();
        list2.add(new Manager());

        ArrayList<String> list3 = new ArrayList<>();
        list3.add("abc");

        ArrayList<Object> list4 = new ArrayList<>();
        list4.add("aaa");

        //method(list1);    // 编译错误
        //method(list2);    // 编译错误
        //method(list3);    // 编译错误
        method(list4);      // 编译正常

    }

    // 可以传入Employee及其子类
    public static void method(ArrayList<? super Employee> list){
        for (Object o : list) {
            Employee e = (Employee) o;
            e.work();
        }
    }

}

abstract class Employee{
    private String name;
    private double salary;


    public Employee() {
    }

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public abstract void work();

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return salary
     */
    public double getSalary() {
        return salary;
    }

    /**
     * 设置
     * @param salary
     */
    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String toString() {
        return "Employee{name = " + name + ", salary = " + salary + "}";
    }
}

class Coder extends Employee{

    @Override
    public void work() {
        System.out.println("程序员写代码...");
    }
}

class Manager extends Employee{

    @Override
    public void work() {
        System.out.println("项目经理分配任务...");
    }
}

2. 数据结构(树)

2.1 树的介绍

2.1 平衡二叉树

2.1.1 左旋

2.1.2 右旋

2.1.3 左左旋

2.1.4 左右旋

2.1.5 右右旋

2.1.6 右左旋

2.2 红黑树

当每次添加节点的颜色是黑色

当每次添加节点的颜色是红色

3. TreeSet 集合

3.1 TreeSet 集合元素排序介绍

package com.itheima.set;

import java.util.TreeSet;

public class TreeSetDemo1 {
    /*
        TreeSet集合的特点体验 : 排序, 去重
     */
    public static void main(String[] args) {
        TreeSet<String> ts = new TreeSet<>();
        ts.add("a");
        ts.add("d");
        ts.add("e");
        ts.add("c");
        ts.add("b");
        ts.add("b");
        ts.add("b");

        System.out.println(ts);

    }
}

以下以返回值全为 -1 (倒序排序为例)

3.2 TreeSet 排序 (自然排序)

package com.itheima.domain;

public class Student implements Comparable<Student>{

    // this.xxx - o.xxx 正序
    // o.xxx - this.xxx 降序
    @Override
    public int compareTo(Student o) {
        // 根据年龄做主要排序条件
        int ageResult = this.age - o.age;
        // 根据姓名做次要排序条件
        int nameResult = ageResult == 0 ? o.name.compareTo(this.name) : ageResult;
        // 判断姓名是否相同
        int result = nameResult == 0 ? 1 : nameResult;
        return result;
    }

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }


}
package com.itheima.set;

import com.itheima.domain.Student;

import java.util.TreeSet;

public class TreeSetDemo2 {
    /*
        TreeSet集合存储Student学生对象

                compareTo 方法的返回值 :

                0 : 只有王五,25
                1 : 正序排列
                -1 : 倒序排序
     */
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<Student>();

        ts.add(new Student("王五", 25));
        ts.add(new Student("王五", 25));
        ts.add(new Student("王五", 25));
        ts.add(new Student("王五", 25));

        System.out.println(ts);
    }
}

3.3 TreeSet 排序 (比较器排序)

package com.itheima.set;

import com.itheima.domain.Student;

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetDemo3 {
    /*
        如果同时具备比较器和自然排序, 会优先按照比较器的规则, 进行排序操作.
     */
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int ageResult = o1.getAge() - o2.getAge();
                return ageResult == 0 ? o1.getName().compareTo(o2.getName()) : ageResult;
            }
        });

        ts.add(new Student("赵六", 26));
        ts.add(new Student("李四", 24));
        ts.add(new Student("张三", 23));
        ts.add(new Student("王五", 25));

        System.out.println(ts);
    }
}

package com.itheima.set;

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetDemo4 {
    public static void main(String[] args) {
        TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length() - o1.length();
            }
        });

        ts.add("aa");
        ts.add("aaaaaaaa");
        ts.add("aaa");
        ts.add("a");

        System.out.println(ts);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32+HAL+Proteus】系列学习教程3---GPIO输出模式(LED流水灯、LED跑马灯)

实现目标 1、掌握GPIO 输出模式控制 2、学会STM32CubeMX软件配置GPIO 3、具体目标&#xff1a;1、开发板4个LED实现流水灯&#xff1b;2、开发板4个LED实现跑马灯灯。 一、STM32 GPIO 概述 1、GPIO定义 GPIO&#xff08;General-purpose input/output&#xff09;是通用输入…

牛客NC238 加起来和为目标值的组合【中等 DFS C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/172e6420abf84c11840ed6b36a48f8cd 思路 本题是组合问题&#xff0c;相同元素不同排列仍然看作一个结果。 穷经所有的可能子集&#xff0c;若和等于target&#xff0c;加入最终结果集合。 给nums排序是为了方便…

Ai-WB2 系列模组SDK接入亚马逊云

文章目录 前言一、准备二、亚马逊云物模型建立1. 注册亚马逊账号&#xff0c;登录AWS IoT控制台&#xff0c;[注册地址](https://aws.amazon.com/cn/)2. 创建好之后点击登录3. 创建物品以及下载证书 三、连接亚马逊云demo获取以及配置1. 下载源码2. 按照顺序执行下面指令3. 修改…

IDEA 2021.3.3最新激活破解教程(可激活至2099年,亲测有效)

1、ja-netfilter-all Windows 系统&#xff0c;点击运行 install-current-user.vbs 脚本&#xff0c;为当前用户安装破解补丁 截图是window环境下的激活方式 运行此补丁大约花费几分钟&#xff0c;点击 确定&#xff0c; 等待 Done 完成提示框出现&#xff0c;到这里&#xf…

HarmonyOS ArkUI实战开发-页面跳转(Router、Ability)

页面跳转可以分为页面内跳转和页面间跳转&#xff0c;页面内跳转是指所跳转的页面在同一个 Ability 内部&#xff0c;它们之间的跳转可以使用 Router 或者 Navigator 的方式&#xff1b;页面间跳转是指所跳转的页面属与不同的 Ability &#xff0c;这种跳转需要借助 featureAbi…

51单片机数字温度报警器_DS18B20可调上下限(仿真+程序+原理图)

数字温度报警器 1 **主要功能&#xff1a;*****\*资料下载链接&#xff08;可点击&#xff09;&#xff1a;\**** 2 **仿真图&#xff1a;**3 **原理图&#xff1a;**4 **设计报告&#xff1a;**5 **程序设计&#xff1a;**主函数外部中断函数DS18B20驱动 6 讲解视频7 **资料清…

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城

源码下载地址&#xff1a;完美运营版商城.zip 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本

Linux 终止进程命令—sudo kill -9 <进程号>

一、查找占用端口的进程&#xff1a;使用以下命令找到占用了该端口的进程&#xff1a; sudo lsof -i :<端口号> 该命令将显示占用该端口的进程的详细信息。 二、结束占用端口的进程&#xff1a;根据上一步得到的进程信息&#xff0c;使用以下命令结束该进程&#xff1a…

CSS-vminvmax单位

vmin 和 vmax 单位 vmin 是相对于视口宽度和高度中较小值进行计算&#xff0c;它的值为视口宽度和高度中的较小值的百分比。 例如&#xff0c;如果视口宽度为 800px&#xff0c;高度为 1000px&#xff0c;那么 1vmin 等于 8px&#xff08;800px 的 1%&#xff09;。 vmax 是…

【Linux】权限(shell运行原理、概念,Linux权限)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 shell命令以及运行原理 创建和删除用户 创建新普通用户 删除用户 Linux权…

【bug】使用mmsegmentaion遇到的问题

利用mmsegmentaion跑自定义数据集时的bug处理&#xff08;使用bisenetV2&#xff09; 1. ValueError: val_dataloader, val_cfg, and val_evaluator should be either all None or not None, but got val_dataloader{batch_size: 1, num_workers: 4}, val_cfg{type: ValLoop}, …

Elasticsearch单机部署(Linux)

1. 准备环境 本文中Elasticsearch版本为7.12.0&#xff0c;JDK版本为1.8.0&#xff0c;Linux环境部署。 扩展&#xff1a; &#xff08;1&#xff09;查看Elasticsearch对应的常用的jdk版本如下&#xff1a;&#xff08;详情可看官网的支持一览表&#xff09; Elasticsearch a…

CTF网络安全大赛详情

网络安全已成为现代社会的一个关键挑战&#xff0c;随着互联网技术的飞速发展&#xff0c;从个人隐私保护到国家安全&#xff0c;网络安全的重要性日益突显。为了应对这一挑战&#xff0c;CTF&#xff08;Capture The Flag&#xff0c;中文&#xff1a;夺旗赛&#xff09;应运而…

03-JAVA设计模式-命令模式

命令模式 什么是命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为对象&#xff0c;从而使你可用不同的请求把客户端与请求的处理者解耦,也称动作模式或事物模式。 在命令模式中&#xff0c;命令对象封装了接收者对象…

Hive架构原理

Hive Hive 的架构是设计用于在大数据环境下进行数据仓库操作和分析的系统。它建立在 Hadoop 生态系统之上&#xff0c;利用 Hadoop 的存储&#xff08;HDFS&#xff09;和计算&#xff08;MapReduce、Tez、Spark 等&#xff09;能力。 1. 元数据存储&#xff08;Metastore&am…

计算机网络-IS-IS链路状态数据库同步

在建立IS-IS邻接关系之后&#xff0c;路由器开始发送LSP报文进行链路状态数据库进行同步。 一、链路状态数据库同步 LSP&#xff08; Link State PDU&#xff0c;链路状态报文&#xff09; 用于交换链路状态信息。LSP分为两种&#xff1a;Level–1 LSP和Level–2 LSP。Level–1…

前端入门:HTML(列表和边框案例)

1.列表知识&#xff1a; list-style-position有两个值&#xff0c;分别是inside&#xff0c;outside&#xff0c;分别表示在标签里面和在标签外面。 2.案例&#xff1a; 源代码&#xff1a; html: <body> <div class"bigBox"> <div>在线解答问题…

基于Springboot+Mybatis-Plus+mysql+html旅游网站

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

【Spring进阶系列丨最终篇】一文详解Spring中的事务控制

0、说明 本篇文章是【Spring进阶系列】专栏的最后一篇文章&#xff0c;至此&#xff0c;我们对Spring的学习就告一段落&#xff0c;接下来我会持续更新【SpringSpringMVCMyBatis整合】专栏&#xff0c;欢迎免费订阅&#xff01; 文章目录 0、说明 一、Spring事务控制1、事务的环…

PDPS16.0单机版及许可证服务器授权安装教程分享

此前小编做过PDPS15(Tecnomatix_15.0)安装包及安装教程分享&#xff0c;此次分享是PDPS16(Tecnomatix_16.0)单机版安装结合SPLMLicenseServer许可证服务器授权安装的教程。服务器型是完整的pdps&#xff0c;单机版只装了个ps&#xff0c;ps的功能一样&#xff0c;仿真需求没要求…