Java-泛型实验

news/2024/4/19 14:12:43/文章来源:https://blog.csdn.net/qq_51495235/article/details/128085584

1.定义一个学生类Student,具有年龄age和姓名name两个属性,并通过实现Comparable接口提供比较规则(返回两个学生的年龄差), 定义测试类Test,在测试类中定义测试方法Comparable getMax(Comparable c1, Comparable c2)完成测试

Student

public class Student implements Comparable<Student> {private String name;private int age;public Student() {super();}public Student(String name, int age) {super();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;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Student s) {Student student = (Student) s;return this.getAge() - student.getAge();}}

StudentTest

public class StudentTest {public static void main(String[] args) {Student s1 = new Student("张三", 18);Student s2 = new Student("李四", 30);if (getMax(s1, s2) < 0) {System.out.println("年龄大的是->" + s2);} else {System.out.println("年龄大的是->" + s1);}}public static int getMax(Comparable<Student> c1, Comparable<Student> c2) {return c1.compareTo((Student) c2);}}

在这里插入图片描述

2.模拟ArrayList集合自定义一个集合类MyArrayList,完成添加和删除功能的泛型设计,定义测试类完成测试

MyArrayList

public class MyArrayList<E> {// 默认大小private static final int DEFAULT_CAPACITY = 10;// 找不到值为-1public static final int ELEMENT_NOT_FOUND = -1;// 集合大小private int size;// 存放元素的数组private E[] elements;// 构造方法public MyArrayList() {clear();}/*** * @Title: clear* @Description: 清空集合* @param:* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public void clear() {size = 0;ensureCapacity(DEFAULT_CAPACITY);}/*** * @Title: ensureCapacity* @Description: 开辟一个新的数组,扩容操作* @param: @param newCapacity* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/@SuppressWarnings("unchecked")public void ensureCapacity(int newCapacity) {if (newCapacity < size) {return;}E[] oldElements = elements;// 新建一个数组elements = (E[]) new Object[newCapacity];for (int i = 0; i < size; i++) {elements[i] = oldElements[i];}}/*** * @Title: size* @Description: 返回集合大小* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public int size() {return size;}/*** * @Title: isEmpty* @Description: 返回集合是否为空* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public boolean isEmpty() {return size() == 0;}/*** * @Title: trimToSize* @Description: 修改指定大小* @param:* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public void trimToSize() {ensureCapacity(size());}/*** * @Title: get* @Description: 获取指定索引的元素* @param: @param  index* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public E get(int index) {rangeCheck(index);return elements[index];}/*** * @Title: indexOf* @Description: 查看元素的索引* @param: @param  element* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public int indexOf(E element) {if (element == null) {for (int i = 0; i < size; i++) {if (elements[i] == null)return i;}} else {for (int i = 0; i < size; i++) {if (element.equals(elements[i]))return i;}}return ELEMENT_NOT_FOUND;}/*** * @Title: contains* @Description: 是否包含指定元素* @param: @param  element* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public boolean contains(E element) {return indexOf(element) != ELEMENT_NOT_FOUND;}/*** * @Title: set* @Description: 修改指定索引的值* @param: @param  index* @param: @param  newElement* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public E set(int index, E newElement) {rangeCheck(index);E old = elements[index];elements[index] = newElement;return old;}/*** * @Title: add* @Description: 直接从尾部插入* @param: @param  addElement 添加的元素* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public boolean add(E addElement) {add(size(), addElement);return true;}/*** * @Title: add* @Description: 指定索引位置添加元素* @param: @param index 索引* @param: @param addElement 添加的元素* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public void add(int index, E addElement) {// 先判断是否需要扩容if (elements.length == size()) {ensureCapacity(size() * 2 + 1);}// 集合元素往后移动for (int i = size; i > index; i--) {elements[i] = elements[i - 1];}elements[index] = addElement;size++;}/*** * @Title: remove* @Description: 删除指定索引的元素* @param: @param  index* @param: @return* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public E remove(int index) {E removeElement = elements[index];// 集合的元素统一向前移动for (int i = index; i < size() - 1; i++) {elements[i] = elements[i + 1];}// 长度减1size--;return removeElement;}/*** * @Title: rangeCheck* @Description: 判断索引是否合法* @param: @param index* @author: KangXiaoZhuang* @email: ITkxz0830@163.com*/public void rangeCheck(int index) {if (index < 0 || index >= size()) {throw new ArrayIndexOutOfBoundsException("索引越界异常!!!");}}public void print() {for (int i = 0; i < size; i++) {System.out.print(elements[i] + " ");}System.out.println();}
}

MyArrayListTest

public class MyArrayListTest {public static void main(String[] args) {MyArrayList<Integer> list = new MyArrayList<>();list.add(getRandom());list.add(getRandom());list.add(getRandom());list.add(getRandom());list.add(getRandom());list.print();System.out.println("==========删除操作==========");list.remove(2);list.print();}public static int getRandom() {Random random = new Random();return random.nextInt(10);}
}

在这里插入图片描述

3.定义一个泛型方法printArray,可以打印输出任何类型的数组,例如:[“小明”,”小红”,”小兰”],[1,2,3] ,定义测试类完成测试。

public class PrintArray {public static void main(String[] args) {Integer[] intArray = { 1, 2, 3, 4, 5 };Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };String[] stringArray = { "小明", "小红", "小兰" };System.out.println("整型数组元素为:");printArray(intArray);System.out.println("\n双精度型数组元素为:");printArray(doubleArray);System.out.println("\n字符型数组元素为:");printArray(charArray);System.out.println("\n字符串数组元素为:");printArray(stringArray);}public static <T> void printArray(T[] array) {System.out.println(Arrays.toString(array));}
}

在这里插入图片描述

4.为某系统提供一个泛型接口Data,该接口可以约束非泛型类TeacherData和StudentData必须完成数据(学生、老师)的增删改查操作

Data

public interface Data<T> {void add(T t);void remove(T t);void update(int index, T t);T query(int index);
}

Student

public class Student {private int id;private String name;public Student(int id, String name) {super();this.id = id;this.name = name;}public Student() {super();}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + "]";}}

StudentData

public class StudentData implements Data<Student> {ArrayList<Student> studentList = new ArrayList<>();@Overridepublic void add(Student s) {studentList.add(s);}@Overridepublic void remove(Student s) {studentList.remove(s);}@Overridepublic void update(int index, Student s) {for (int i = 0; i < studentList.size(); i++) {if (s == studentList.get(i)) {index = i;break;}}studentList.set(index, s);}@Overridepublic Student query(int index) {return studentList.get(index);}public ArrayList<Student> getArrayList() {return this.studentList;}
}

TeacherData

public class TeacherData implements Data<Teacher> {ArrayList<Teacher> teacherList = new ArrayList<>();@Overridepublic void add(Teacher t) {teacherList.add(t);}@Overridepublic void remove(Teacher t) {teacherList.remove(t);}@Overridepublic void update(int index, Teacher t) {for (int i = 0; i < teacherList.size(); i++) {if (t == teacherList.get(i)) {index = i;break;}}teacherList.set(index, t);}@Overridepublic Teacher query(int index) {return teacherList.get(index);}public ArrayList<Teacher> getArrayList() {return this.teacherList;}
}

DataTest

public class DataTest {public static void main(String[] args) {DataTest dataTest = new DataTest();dataTest.testStudent();System.out.println("===========================================");dataTest.testTeacher();}public void testStudent() {Teacher t1 = new Teacher(13, "小红");Teacher t2 = new Teacher(4, "小明");Teacher t3 = new Teacher(68, "小花");Teacher t4 = new Teacher(98, "小庄");Teacher t5 = new Teacher(24, "小康");TeacherData teacherData = new TeacherData();System.out.println("添加元素");teacherData.add(t1);teacherData.add(t2);teacherData.add(t3);teacherData.add(t4);teacherData.add(t5);System.out.println(teacherData.getArrayList());teacherData.remove(t1);System.out.println("\n删除元素");System.out.println(teacherData.getArrayList());System.out.println("\n更新元素");teacherData.update(2, new Teacher(66, "康小庄"));System.out.println(teacherData.getArrayList());System.out.println("\n查询元素");System.out.println(teacherData.query(3));}public void testTeacher() {Teacher t1 = new Teacher(1, "张三");Teacher t2 = new Teacher(2, "李四");Teacher t3 = new Teacher(3, "王五");Teacher t4 = new Teacher(4, "赵六");Teacher t5 = new Teacher(5, "田七");TeacherData teacherData = new TeacherData();System.out.println("添加元素");teacherData.add(t1);teacherData.add(t2);teacherData.add(t3);teacherData.add(t4);teacherData.add(t5);System.out.println(teacherData.getArrayList());teacherData.remove(t1);System.out.println("\n删除元素");System.out.println(teacherData.getArrayList());System.out.println("\n更新元素");teacherData.update(0, new Teacher(8, "新教师"));System.out.println(teacherData.getArrayList());System.out.println("\n查询元素");System.out.println(teacherData.query(1));}
}

在这里插入图片描述

5.顺序表是线性表的顺序存储,是在计算机内存中以数组的形式保存的线性表,请完善顺序表的数据结构,顺序表的泛型类设计如下。

类名 SequenceList
构造方法 SequenceList(int capacity) 创建容量为capacity的SequenceList对象
成员方法
1.public void clear() 置空顺序表
2.public boolean isEmpty() 判断顺序表是否为空
3.public int length() 获取顺序表的元素个数
4.public T get(int i) 返回顺序表中的第i个元素
5.public void insert(int i,T t) 在顺序表的第i个元素之前插入一个元素t
6.public void insert(T t) 向顺序表中添加一个元素t
7.public T remove(int i) 删除并返回顺序表中的第i个元素
8.public int indexOf(T t) 返回顺序表中首次出现元素t的位置,若不存在返回-1
成员变量
1.private T[] eles 存储元素的数组
2.private int n 当前顺序表的长度

6.顺序表的遍历:
(1)让SequenceList实现Iterable接口,重写iterator方法;
(2)在SequenceList类内部提供一个内部类 SIterator,实现Iterable接口,重写hasNext方法和next方法。
(3)编写测试类,测试SequenceList类支持的foreach循环。

SequenceList

@SuppressWarnings("all")
public class SequenceList<T> implements Iterable<T> {// 存储元素的数组private T[] eles;// 当前顺序表的长度private int n;// 创建容量为capacity的SequenceList对象SequenceList(int capacity) {eles = (T[]) new Object[capacity];}// 置空顺序表public void clear() {for (int i = 0; i < n; i++) {eles[i] = null;}n = 0;}// 判断顺序表是否为空public boolean isEmpty() {return n == 0;}// 获取顺序表的元素个数public int length() {int count = 0;for (int i = 0; i < n; i++) {if (eles[i] != null) {count++;}}return count;}// 返回顺序表中的第i个元素public T get(int i) {return eles[i];}// 在顺序表的第i个元素之前插入一个元素tpublic void insert(int i, T t) {for (int j = n - 1; j >= i; j--) {eles[j + 1] = eles[j];}eles[i] = t;n++;}// 向顺序表中添加一个元素tpublic void insert(T t) {insert(n, t);}// 删除并返回顺序表中的第i个元素public T remove(int i) {T oldelement = eles[i];for (int j = i + 1; j < n; j++) {eles[j - 1] = eles[j];}eles[--n] = null;return oldelement;}// 返回顺序表中首次出现元素t的位置,若不存在返回-1public int indexOf(T t) {if (eles == null) {for (int i = 0; i < n; i++) {if (eles[i] == null) {return i;}}} else {for (int i = 0; i < n; i++) {if (eles.equals(eles[i])) {return i;}}}return -1;}public void print() {for (T t : eles) {if (t != null) {System.out.print(t + ",");}}}@Overridepublic Iterator<T> iterator() {return new SIterator<T>(this);}class SIterator<T> implements Iterator<T> {private int current = 0;private SequenceList<T> sequenceList;public SIterator(SequenceList<T> sequenceList) {this.sequenceList = sequenceList;}@Overridepublic boolean hasNext() {// 判断是否还有下一个return current < sequenceList.length();}@Overridepublic T next() {// 看是否还有下一个if (!hasNext()) {throw new NoSuchElementException();}return sequenceList.eles[current++];}public void remove() {SequenceList.this.remove(--current);}}
}

SequenceListTest

public class SequenceListTest {public static void main(String[] args) {test01();}public static void test01() {SequenceList<Integer> sequenceList = new SequenceList<Integer>(10);System.out.println("添加元素");for (int i = 0; i < 10; i++) {sequenceList.insert(i);}sequenceList.print();System.out.println();System.out.println("清空集合");sequenceList.clear();System.out.println("集合大小:" + sequenceList.length());System.out.println("添加元素");for (int i = 10; i < 20; i++) {sequenceList.insert(i);}sequenceList.print();System.out.println();System.out.println("集合大小:" + sequenceList.length());System.out.println("集合是否为空:" + sequenceList.isEmpty());System.out.println("索引5的元素是:" + sequenceList.get(5));System.out.println("删除索引5的元素:" + sequenceList.remove(5));sequenceList.print();System.out.println();System.out.println("迭代器遍历");// 迭代器遍历Iterator<Integer> iterator = sequenceList.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

在这里插入图片描述

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

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

相关文章

Docker-JenKins安装及配置!

Jenkins官网&#xff1a;Jenkins 安装主机配置&#xff08;官方&#xff09;&#xff1a; 最低&#xff1a; 256 MB 内存 1 GB 的驱动器空间&#xff08;尽管如果将 Jenkins 作为 Docker 容器运行&#xff0c;则建议至少 10 GB&#xff09; 小团队推荐&#xff1a; 4 GB …

英文ppt怎么翻译成中文?教你几种ppt翻译方法

ppt文件受到很多人的喜欢是因为它展示起来直观清晰&#xff0c;无论是老师在课堂上使用ppt课件来教学&#xff0c;还是在工作汇报中用ppt文件展示设计的方案或取得的成果。但当我们需要把ppt文档里的文本内容里的外语翻译成中文的时候&#xff0c;我们应该怎么做呢&#xff1f;…

003. 电话号码的字母组合——回溯算法

1.题目链接&#xff1a; 17. 电话号码的字母组合 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给定一个仅包含数字 2-9 的字符串 digits &#xff0c;返回所有它能表示的字母组合。 数字和字母的关系&#xff1a; 例子&#xff1a; 输入&#xff1a;"23" …

[Spring]第二篇:IOC控制反转

简单的说就是,创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转. spring创建对象时,会读取配置文件,配置文件中主要配置接口和实现类的关系,每个接口对相应一个实现类,使用<bean>标签配置,<bean中的id可以随便…

学生选课系统

项目描述 通过项目背景的分析以及了解到现在学校面临的问题&#xff0c;特别需要一个选课管理系统保证学生信息以及各种课程成绩的准确性和实效性&#xff0c;通过利用计算机的高速计算和快速的统计分析&#xff0c;保证学生信息的最新记录。从教职工的角度老考虑&#xff0c;…

用VS软件开发“中国象棋“游戏<笔记摘录>

整体架构如上 1.很直观地去看这个中国象棋的界面,数一下它有多少行和多少列. 10行,9列:要注意这里数的是安放象棋的位置,有10行9列 这里我们首先想到的必然是二维数组,每一个行列交叉的点都设置成二维数组a[i][j]这样的格式,以此来确定棋盘上面每一个棋子的位置和走向. 我们…

详解 Spring Boot 项目中的配置文件

目录 1. Spring Boot 项目中配日文件的作用是什么 2. Spring Boot 配置文件的两种格式 3. properties 配置文件 3.1 properties 配置文件的基本语法 3.2 properties 配置文件的分类 3.3 如何读取配置文件 3.4 properties 配置文件的优缺点分析 4. yml 配置文件 4.1 yml …

BP神经网络PID从Simulink仿真到PLC控制实现(含博途PLC完整SCL源代码)

单神经元自适应PID控制博途PLC完整源代码,请参看下面的文章链接: 博途PLC单神经元自适应PID控制_RXXW_Dor的博客-CSDN博客_单神经元pid控制1、单神经元作为构成神经网络的基本单位,具有自学习和自适应能力,且结构简单易于计算,传统的PID具有结构简单、调整方便和参数整定…

【软件测试】8年资深测试说出来我们的心声......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 执着于手动的功能测…

SSM毕设项目 - 基于SSM的毕业设计管理系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.2.1 系统开发流程3.3.2 教师登录流程3.3.3 系统操作流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新…

【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 与传统的影视行业相比&#xff0c;诞生于移动互联网时代的短视频是个全新行业&#xff0c;它制作方便又容易传播&#xff0c;一出现就成为大街小巷的时髦潮流。 各行各业的人们均可通过短视频展示自己&#xff0c;短小精悍的视频…

社区系统项目复盘-6

文章目录什么是Elasticsearch&#xff1f;Spring是怎么整合Elasticsearch的&#xff1f;开发社区搜索功能Elasticsearch实现全文搜索功能什么是Elasticsearch&#xff1f; Elasticsearch简介 一个分布式的、Restful风格的搜索引擎支持对各种类型的数据的检索搜索速度快&#xf…

基于粒子群算法和遗传算法优化的高速列车横向悬挂

目录 前言 1.高速列车模型 2.优化算法优化模糊PID流程 3.普通PID、优化算法模糊PID仿真对比 3.1 模糊控制器设计 3.2 仿真结果 3.2.1粒子群优化PID 3.2.2粒子群优化模糊PID 3.2.3遗传算法优化模糊PID 4.总结 前言 高速列车&#xff0c;是指最高行驶速度在200km/h 及以…

小知识· Zigbee 简介

1. 介绍 ZigBee是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术 ZigBee建立在IEEE 802.15.4标准&#xff08;定义了PHY和MAC层&#xff09;之上&#xff0c;ZigBee联盟对其网络层和应用层进行了标准化 ZigBee协议栈可分为五层 - 物理层&#xff08;PHY&a…

多进程并发服务器

TCP三次握手建立连接错误处理模块&#xff1a;wrap.c,函数声明&#xff1a;wrap.h并发服务器模型&#xff08;多进程&#xff0c;多线程&#xff09; 转换大小写程序 服务端 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #incl…

Mybatis Plus 多租户id使用

本文就不多逼逼&#xff0c;直接进入正题。 什么是多租户 多租户技术&#xff08;Multi-TenancyTechnology&#xff09;又称多重租赁技术&#xff0c;简称SaaS&#xff0c;是一种软件架构技术&#xff0c;是实现如何在多用户环境下 &#xff08;此处的多用户一般是面向企业用…

Java SPI机制的使用和理解

前言&#xff1a; SPI(Service Provider Interface)&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;Java中 SPI 机制主要思想是将装配的控制权移到程序之外&#xff0c;在模块化设计中这个机制尤其重要&#xff0c;其核心思想就是解耦 1、大家都知道API&#xff0c;却…

【C++】STL —— map和set的模拟实现

目录 一、基础铺垫 二、基本结构分析 1. 节点结构分析 2. 模板参数中仿函数分析 三、正向迭代器 四、封装完成的红黑树 五、map的模拟实现 六、set的模拟实现 一、基础铺垫 在前面的博客中我们了解了map和set的基本使用&#xff0c;以及对二叉搜索树、AVL树和红黑树的…

IPv6进阶:IPv6 过渡技术之 NAT64(IPv6 节点主动访问 IPv4 节点-地址池方式)

实验拓扑 PC1是IPv4网络的一个节点&#xff0c;处于Trust安全域&#xff1b;PC2是IPv6网络的一个节点&#xff0c;处于Untrust安全域。 实验需求 完成防火墙IPv4、IPv6接口的配置&#xff0c;并将接口添加到相应的安全域&#xff1b;在防火墙上配置NAT64的IPv6前缀3001::/64&…

【毕业设计】30-基于单片机矿井瓦斯_气体浓度_烟雾浓度报警设计(原理图+源代码+仿真+答辩论文+答辩PPT)

【毕业设计】30-基于单片机矿井瓦斯/气体浓度/烟雾浓度报警设计&#xff08;原理图源代码仿真答辩论文答辩PPT&#xff09; 文章目录【毕业设计】30-基于单片机矿井瓦斯/气体浓度/烟雾浓度报警设计&#xff08;原理图源代码仿真答辩论文答辩PPT&#xff09;任务书设计说明书摘要…