package com.arbonkeep;
/**
* @author arbonkeep
* @date 2019/12/26 - 23:31
*/
public class DynamicArray<E> {
//元素数量
private int size;
//所有元素 :数组
private E[] elements;
//常量
private static final int DEFAULT_CAPACITY = 10;//默认容量为10
private static final int ELEMENT_NOT_FOUND = -1;//元素找不到返回-1
//构造方法初始化数组
public DynamicArray(int capacity) {
//进行判断,如果传入容量小于初始容量,就赋值为初始容量
capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
//初始化数组
elements = (E[]) new Object[capacity];//这里不能够new E[]
}
//空参构造
public DynamicArray() {
this(DEFAULT_CAPACITY);//调用有参构造
}
//清除所有元素
public void clear() {
for (int i = 0; i < size; i++) {
elements[i] = null;
//将数组每个元素都赋值为null,这是因为我们需要保留堆空间所分配的空间,而不需要对应的对象
}
size = 0;
}
//返回元素个数
public int size() {
return size;
}
//判断是否为空
public boolean isEmpty() {
return size == 0;
}
//是否包含元素
public boolean contains(E element) {
return indexOf(element) != ELEMENT_NOT_FOUND;//只要索引不为-1说明元素就存在
}
//获取index索引位置获取元素
public E get(int index) {
rangeCheck(index);
return elements[index];
}
//将index位置的元素设置为新元素,并返回原来的元素
public E set(int index, E element) {
rangeCheck(index);
E old = elements[index];
elements[index] = element;
return old;
}
//在index位置插入一个元素
public void add(int index, E element) {
rangeCheckAdd(index);
//检查是否需要扩容,如果需要直接在该方法中完成扩容
ensureCapacity(size + 1);
//思考:为什么是size - 1,和index
//因为在index位置插入一个元素,那么从index开始到最后一个元素都是需要向后移动的,
//并且需要遵循后面的元素先移动的规律
// for (int i = size -1; i >= index; i--) {//遵循后面的元素先移动,直到index元素
// elements[i + 1] = elements[i];//后移,将i移动到i+1
// }
//优化
for (int i = size; i > index; i--) {
elements[i] = elements[i - 1];//将i-1移动到i
}
elements[index] = element;
size++;
}
//在数组的尾部添加一个元素
public void add(E element) {
// elements[size] = element;
// size++;
//调用含有index的add方法
add(size, element);//在size处(最后)添加
}
//删除index位置的元素,并将删除的元素返回
public E remove(int index) {
rangeCheck(index);
E old = elements[index];
//思考:为什么是时index + 1和index -1(最后一个元素) 呢?
// 这是因为删除元素后,需要向前移动的元素的范围是index + 1 到index -1
for (int i = index + 1; i < size; i ++) {//遍历需要向前移动的元素,i<size等价于i <= size - 1
elements[i - 1] = elements[i];//将后面一个元素前移
}
size--;
elements[size] = null;
return old;
}
//删除指定的元素
public void remove(E element) {
remove(indexOf(element));//调用方法执行删除
}
//查看元素的索引
public int indexOf(E element) {
if (element == null) {
for (int i = 0; i < size; i++) {
if (elements[i] == null) return i;//如果元素为null,那么就返回null对应的索引
}
}else {
for (int i = 0; i < size; i++) {
if (element.equals(elements[i])) return i;
}
}
return ELEMENT_NOT_FOUND;
}
//保证需要有capacity的容量,即扩容
private void ensureCapacity(int capacity) {
int oldCapacity = elements.length;
if (oldCapacity >= capacity) return;//不需要扩容,直接返回
//新容量为旧容量的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);//1+1/2
E[] newElements = (E[])new Object[newCapacity];//创建一个新的数组
//遍历,将旧数组的元素添加到新数组中
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
//将新数组的引用指向旧数组,覆盖旧数组
elements = newElements;
//打印扩容信息
System.out.println(oldCapacity + "扩容为" + "_" + newCapacity);
}
//封装异常
private void outOfBounds(int index) {//索引越界
throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size);
}
//范围检查
private void rangeCheck(int index) {
if (index < 0 || index >= size ) {
outOfBounds(index);
}
}
//范围检查允许添加
private void rangeCheckAdd(int index) {
if (index < 0 || index > size ) {//注意:这里是允许=size的,这是因为插入元素可以在size插入
outOfBounds(index);
}
}
//toString方法,要求size = ?,[11, 22, 33]
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("size=").append(size).append(", [");
for (int i = 0; i < size; i++) {
if (i != 0) {
sb.append(", ");
}
sb.append(elements[i]);
// if (i != size -1) {
// sb.append(", ");
// }
}
sb.append("]");
return sb.toString();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
恋上数据结构系列,数据结构与算法.zip
共29个文件
java:13个
class:8个
xml:4个
需积分: 2 0 下载量 48 浏览量
2024-01-14
12:42:10
上传
评论
收藏 33KB ZIP 举报
温馨提示
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
恋上数据结构系列,数据结构与算法.zip (29个子文件)
open_suanfayushujujiegouxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxcxvcvcv
03_链表
src
com
arbonkeep
AbstractList.java 1KB
ArrayList.java 5KB
List.java 1KB
Main.java 377B
LinkedList.java 5KB
00_leetcode
src
com
arbonkeep
链表
leetcode_237_删除链表中的节点.java 619B
leetcode_141_环形链表.java 1KB
leetcode_206_反转链表.java 1KB
01_复杂度
src
com
arbonkeep
TimeTools.java 934B
Test.java 4KB
01_复杂度.iml 423B
out
production
01_复杂度
com
arbonkeep
Test.class 1KB
Test$1.class 689B
Test$2.class 689B
TimeTools.class 2KB
TimeTools$Task.class 209B
02_动态数组
com
arbonkeep
DynamicArray.class 4KB
Main.class 1KB
Assert.class 579B
.idea
.name 12B
uiDesigner.xml 9KB
workspace.xml 52KB
misc.xml 273B
modules.xml 782B
02_动态数组
src
com
arbonkeep
DynamicArray.java 6KB
Main.java 1KB
Assert.java 333B
02_动态数组.iml 761B
.gitignore 15B
共 29 条
- 1
资源评论
极致人生-010
- 粉丝: 4379
- 资源: 3086
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功