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

embedded/2024/10/18 23:27:50/

1. 泛型

1.1 泛型介绍

java">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 泛型类

java">package com.itheima.generics;import java.util.ArrayList;public class GenericsDemo2 {/*常见的泛型标识符 : E V K TE : ElementT : TypeK : 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 泛型方法

java">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 泛型接口

java">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>{@Overridepublic void show(String s) {}
}class InterBIml<E> implements Inter<E>{@Overridepublic void show(E e) {}
}

1.5 泛型通配符

java">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{@Overridepublic void work() {System.out.println("程序员写代码...");}
}class Manager extends Employee{@Overridepublic 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 集合元素排序介绍

java">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 排序 (自然排序)

java">package com.itheima.domain;public class Student implements Comparable<Student>{// this.xxx - o.xxx 正序// o.xxx - this.xxx 降序@Overridepublic 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 + "}";}}
java">package com.itheima.set;import com.itheima.domain.Student;import java.util.TreeSet;public class TreeSetDemo2 {/*TreeSet集合存储Student学生对象compareTo 方法的返回值 :0 : 只有王五,251 : 正序排列-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 排序 (比较器排序)

java">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>() {@Overridepublic 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);}
}

java">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>() {@Overridepublic 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);}
}


http://www.ppmy.cn/embedded/9981.html

相关文章

图论基础知识 深度搜索(DFS,Depth First Search),广度搜索(BFS,Breathe First Search)

图论基础知识 学习记录自代码随想录 dfs 与 bfs 区别 dfs是沿着一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到搜不下去了&#xff0c;再换方向&#xff08;换方向的过程就涉及到了回溯&#xff09;。 bfs是先把本节点所连接的所有节点遍历一遍&#xff0c;走到下…

Vs Code npm install 报错解决方法

用的人家的前端框架发现是封装过的&#xff0c;要修改人家前端的话还得把前端源码放在Vs Code 上运行&#xff0c;后端放在IDEA上运行&#xff0c;然后前后端并行开发&#xff0c;在配置前端环境时遇到&#xff1a; npm install 这个的原因是我把node下载到D盘了权限不够框框爆…

Google Ads广告为Demand Gen推出生成式AI工具,可自动生成广告图片

谷歌今天宣布在Google Ads广告中为Demand Gen活动推出新的生成人工智能功能。 这些工具由谷歌人工智能提供支持&#xff0c;广告商只需几个步骤即可使用文本提示创建高质量的图片。 这些由人工智能驱动的创意功能旨在增强视觉叙事能力&#xff0c;帮助品牌在YouTube、YouTube…

代码随想录算法训练营day48

198.打家劫舍 五部曲&#xff1a; dp数组下标及含义&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 dp数组初始化&#xff1a;dp[0] nums[0];dp[1] max(nums[0], nums[1]); 递推公式&#xff1a; dp[i] max(dp[i …

Python中的WinForms类桌面应用程序开发

在Windows操作系统中&#xff0c;WinForms是一种流行的GUI&#xff08;图形用户界面&#xff09;框架&#xff0c;用于创建桌面应用程序。虽然WinForms是.NET框架的一部分&#xff0c;Python开发者可以使用类似的库来创建桌面应用程序。在这篇博客中&#xff0c;我们将介绍几个…

Java后端中如何随意接收参数

目录 一、参数名相同 二、参数名不同&#xff0c;使用RequestParam注解 大概访问流程是&#xff1a;先访问test控制器&#xff0c;test控制器跳转到index页面&#xff08;此时index页面收到了test控制器传来的数据&#xff09;&#xff0c;然后在index页面跳转到t5控制器&…

牛客NC162 二叉树中和为某一值的路径(三)【中等 dfs C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/965fef32cae14a17a8e86c76ffe3131f 思路 既然要找所有路径上节点和等于目标值的路径个数&#xff0c;那我们肯定先找这样的路径起点啊&#xff0c; 但是我们不知道起点究竟在哪里&#xff0c; 而且任意节点都有…

STM32F103ZET6 封装 LQFP-144 ST意法 单片机芯片

STM32F103ZET6 是意法半导体&#xff08;STMicroelectronics&#xff09;生产的一款基于 ARM Cortex-M3 内核的 32 位微控制器。它具有高性能、低功耗的特点&#xff0c;广泛应用于各种嵌入式系统和工业应用中。STM32F103ZET6 的主要特点如下&#xff1a; 内核&#xff1a;ARM…