public class Array<E> {private E[] data;private int size;// 构造函数public Array(int Capacity){data = (E[])new Object[Capacity];size = 0;}// 默认构造函数public Array(){this(10);}// 判断数组是否已满public boolean isFull(){return size == data.length;}// 判断数组是否为空public boolean isEmpty(){return size == 0;}// 找出元素 e 的下标,没有返回 -1public int find(E e){for(int i = 0; i < size; i++){if(data[i].equals(e)){return i;}}return -1;}// 判断数组是否包含元素 epublic boolean contain(E e){return find(e) == -1 ? false : true ;}// 获取数组的大小 sizepublic int getSize(){return size;}// 获取数组的容量 Capacitypublic int getCapacity(){return data.length;}// 获取下标为 index 位置的元素 epublic E get(int index){// 判断传入下标是否合法if(index < 0 || index >= size){throw new IllegalArgumentException("Get Failed! Index is illegal!");}return data[index];}// 获取数组的第一个元素public E getFirst(){return get(0);}// 获取数组的最后一个元素public E getLast(){return get(size - 1);}// 设置下标 index 位置处的元素为 epublic void set(int index, E e){// 判断传入下标是否合法if(index < 0 || index >= size){throw new IllegalArgumentException("Set Failed! Index is illegal!");}data[index] = e;}// 在下标为 index 位置插入元素 epublic void add(int index, E e){// 判断传入下标是否合法if(index < 0 || index > size){throw new IllegalArgumentException("Add Failed! Index is illegal!");}// 如果数组已满,则重新分配空间if (isFull()){resize(data.length * 2);}// 在 index 位置插入元素 efor (int i = size - 1; i >= index; i--){data[i + 1] = data[i];}data[index] = e;size++;}// 在数组头插入元素 epublic void addFirst(E e){add(0, e);}// 在数组尾插入元素 epublic void addLast(E e){add(size, e);}// 删除下标为 index 位置处的元素public E remove(int index){// 判断下标是否合法if (index < 0 || index >= size){throw new IllegalArgumentException("Remove Failed! Index is illegal!");}E tmp = data[index];for(int i = index; i < size - 1; i++){data[i] = data[i + 1];}size--;// 判断是否需要重新分配空间if (size == data.length / 4 && data.length / 2 != 0){resize(data.length / 2);}return tmp;}// 删除数组头部元素public E removeFirst(){return remove(0);}// 删除数组尾部元素public E removeLast(){return remove(size - 1);}// 删除元素 epublic void removeElement(E e){int index = find(e);if (index != -1){remove(index);}}// 重新分配空间大小public void resize(int newCapacity){if (newCapacity <= 0){throw new IllegalArgumentException("Resize Failed! NewCapacity is illegal!");}E[] newData = (E[])new Object[newCapacity];for (int i = 0; i < size; i++){newData[i] = data[i];}data = newData;}// 重载打印函数@Overridepublic String toString(){StringBuilder res = new StringBuilder();res.append(String.format("Array size = %d, Capacity = %d\n", size, data.length));res.append("[");for (int i = 0; i < size; i++){res.append(data[i]);if (i != size - 1)res.append(", ");}res.append("]");return res.toString();}public static void main(String[] args){Array<Integer> arr = new Array<>();for(int i = 0 ; i < 10 ; i ++)arr.addLast(i);System.out.println(arr);arr.add(1, 100);System.out.println(arr);arr.addFirst(-1);System.out.println(arr);arr.remove(2);System.out.println(arr);arr.removeElement(4);System.out.println(arr);arr.removeFirst();System.out.println(arr);for(int i = 0 ; i < 4 ; i ++){arr.removeFirst();System.out.println(arr);}}
}

基于java的数据结构学习——泛型动态数组的封装相关推荐

  1. 基于java的数据结构学习——数组实现的栈以及简单应用C++实现

    基于java的数据结构学习--数组实现的栈以及简单应用的 C++ 实现 源码: // // Created by PC-Saw on 2019/1/3. //#ifndef DATA_STRUCTUR ...

  2. 基于java的数据结构学习——动态数组C++类模板(含拷贝构造,重载常见运算符)

    之前实现了java的动态数组,试着写了个C++版的,同样对时间复杂度振荡进行了处理.纯手打,代码如下 : // // Created by PC-Saw on 2018/12/19. //#ifnde ...

  3. 基于java的数据结构学习——数组实现的队列和循环队列及性能对比

    队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue ...

  4. 基于java的数据结构学习——数组实现的栈以及简单应用

    栈 Stack 栈是一种线性结构 相比数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从一端取出元素 这一端称为栈顶 栈是一种后进先出的数据结构 栈的应用 无处不在的Undo操作(撤销) 括 ...

  5. 爪哇国新游记之十五----泛型动态数组类

    import java.lang.reflect.Array;/*** 泛型动态数组类**/ public class DynamicArray<T extends Object>{pri ...

  6. 基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  7. 基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA计算机在线学习管理系统-计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技 ...

  8. 基于逐维反向学习的动态适应布谷鸟算法

    文章目录 一.理论基础 1.布谷鸟搜索算法 2.DA-DOCS算法 (1)逐维反向学习策略 (2)动态适应 (3)DA-DOCS算法流程 二.实验与结果分析 三.参考文献 一.理论基础 1.布谷鸟搜索 ...

  9. Delphi泛型动态数组的扩展,归属 武稀松 所有!

    武稀松真的是Delphi 界里的一个大银才,他写的博客文章非常新颖和实用,如今竟然将泛型数组封装的如此有声有色. 我对这个泛型动态数组的扩展爱不释手,在他开源的代码上,增加了排序和搜索两个小功能,纯属 ...

最新文章

  1. 【阿里云课程】生成模型之GAN原理与优化基础
  2. boost::movelib::unique_ptr相关的测试程序
  3. php sqlserver开发实例,Linux_用sql脚本创建sqlserver数据库范例语句,下面是创建一个sqlserver数据库 - phpStudy...
  4. python爬虫第一课 开发环境配置
  5. 【空间数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程
  6. TensorFlow 2.0 - tf.data.Dataset 数据预处理 猫狗分类
  7. [家里蹲大学数学杂志]第275期华中师范大学2011年数学专业复试试题及部分参考解答...
  8. Centos6.5 邮件服务
  9. Software caused connection abort: socket write error 问题原因推测
  10. 高通平台开发系列讲解(USB篇)Vbus检测程序
  11. Java实现港(澳)台大陆身份证校验(亲测有效)
  12. mysql拼音码自动生成_根据中文名,自动生成首字母的拼音码或拼音码(两种方法)...
  13. 工作环境配置及putty工具常见设置
  14. 基于Nginx日志的自动封异常ip和解封脚本
  15. 利用leaflet做一个飞机航线 可根据方向动态掉头
  16. 商科能读计算机专业吗,我本科读的计算机 想去新西兰留学可以换专业吗? 没分了跪求啊,...
  17. 阿里云镜像站repo文件
  18. 数学家教你烤肉饼:按最佳时机翻面可节省近1/3烹饪时间,网友:想去汉堡王应聘厨子了...
  19. ARM SMMU介绍
  20. 线性表操作(线性表)

热门文章

  1. mysql libstdc .so.6_编译安装mysql报错 ./mysqld: /usr/lib64/libstdc++.so.6:
  2. 循环彩灯实验c语言程序,实验3LED指示灯循环控制.doc
  3. mysql 优化表_mysql里sql优化和表结构优化
  4. html5 自定义 datepicker,如何使用 React 构建自定义日期选择器(3)
  5. ionic判断android版本,$ionicplatform 判断是android还是ios?
  6. Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载
  7. oracle 12 ORA-01262,oracle物理dg安装:方法二
  8. leetcode1299. 将每个元素替换为右侧最大元素
  9. leetcode200. 岛屿数量
  10. Python(20)-高级数据类型的公共方法