动态数组(Array)
动态数组的概念
我们可以理解为动态数组就是在普通数组上增加了一个可以根据元素的个数动态调整数组大小的功能。在Java中提供的数组一般都是静态数组int[]char[]long[](定义之后没法改变长度)这时候就需要我们自己定义一个类,拓展基础数组的功能就为动态数组。动态数组相对于一般数组的优势是可以灵活地添加或删除元素。而一般数组则受限于固定的内存空间。只能有限的添加元素。
public class Array {private int[] data;//存放元素仍是整型数组;private int size;//表是动态数组中已经存储的元素个数;
}
size:表示当前动态数组中实际存储的元素个数,下一个元素添加时候的索引。
int[]data;data.length表示此时数组最大容纳大元素个数。当size==data.length时就是表明这个数组容量已满需要扩容处理。
private void grow(){//copyOf方法返回扩容后的新数组this.data= Arrays.copyOf(data,data.length*2);}
元素的增加操作
add(添加一个新元素)
public void add(int val){data[size]=val;size++;if (size==data.length){
//如果数组容量已满grow();}}
add(int index,int val)在index位置插入新元素val
public void adds(int index,int val){if (index<0||index>size){System.err.println("add index");return;}for (int i = size-1; i <index ; i++) {data[i+1]=data[i];}data[index]=val;size++;//判断数组是否已满if (size==data.length){grow();}}
元素的删除操作
remove(int index):删除指定index位置的元素。
remove(1):删除索引为1的元素
此时需要把index之后所有元素向前移动一个单位,先从index+1开始向前移动,这样就可以覆盖的就是index位置的元素。
public int remove(int index){//先判断索引的合法if (index<0||index>=size){return -1;}int Val=data[index];for (int i = index; i <size-1; i++) {data[i]=data[i+1];}size--;
// return size;return Val;}
删除数组中所有值为val的元素
当出现连续的val值,再删除remove(index)之后,任然要判断当前i是否还是待删除元素。这时候我们就要用while循环来判断。
public int removeBy(int val){for (int i = 0; i <size ; i++) {while (data[i]==val){remove(i);}}size--;return val;}
元素查询的操作
//查询动态数组值为vale元素的索引public int getByVale(int val){for (int i = 0; i < size; i++) {if (data[i]==val){return i;}}//如果没找到val值return -1;}public boolean contains(int val){int index=getByVale(val);return index!=-1;}//查询索引为index的值并返回更改前的值public int get(int index){if (index<0||index>=size){System.err.println("get index illegal");return -1;}return data[index];
元素的更改操作
//更改数组中为索引index的位置为val的值public int set(int index ,int newVal){if (index<0||index>=size){System.err.println("set index.illegal!");return -1;}int oldVal=data[index];data[index]=newVal;
return oldVal;}public boolean setValue(int oldVal,int newVal){int index=getByVale(oldVal);if (index!=-1){data[index]=newVal;return true;}return false;}
动态数组的完整代码
package seqlist;import java.util.Arrays;public class Array {private int[] data;//存放元素仍是整型数组;private int size;//表是动态书组中已经存储的元素个数;public Array(){this(10);}public Array( int intCap){this.data=new int[intCap];}//增加一个新的元素public void add(int val){data[size]=val;size++;if (size==data.length){grow();}}//在数组index的位置插入一个值为val的元素public void adds(int index,int val){if (index<0||index>size){System.err.println("add index");return;}for (int i = size-1; i <index ; i++) {data[i+1]=data[i];}data[index]=val;size++;//判断数组是否已满if (size==data.length){grow();}}//查询动态数组值为vale元素的索引public int getByVale(int val){for (int i = 0; i < size; i++) {if (data[i]==val){return i;}}//如果没找到val值return -1;}public boolean contains(int val){int index=getByVale(val);return index!=-1;}//查询索引为index的值并返回更改前的值public int get(int index){if (index<0||index>=size){System.err.println("get index illegal");return -1;}return data[index];}//更改数组中为索引index的位置为val的值public int set(int index ,int newVal){if (index<0||index>=size){System.err.println("set index.illegal!");return -1;}int oldVal=data[index];data[index]=newVal;
return oldVal;}public boolean setValue(int oldVal,int newVal){int index=getByVale(oldVal);if (index!=-1){data[index]=newVal;return true;}return false;}//删除索引为index对应的元素,并返回删除的值public int remove(int index){//先判断索引的合法if (index<0||index>=size){return -1;}int Val=data[index];for (int i = index; i <size-1; i++) {data[i]=data[i+1];}size--;
// return size;return Val;}//删除数组中所有为val的值public int removeBy(int val){for (int i = 0; i <size ; i++) {while (data[i]==val){remove(i);}}size--;return val;}//toString打印数组public String toString(){String ret="[";for (int i = 0; i < size; i++) {ret+=data[i];if (i!=size-1){ret+=",";}}ret+="]";return ret;}private void grow(){//copyOf方法返回扩容后的新数组this.data= Arrays.copyOf(data,data.length*2);}
}
动态数组(Array)相关推荐
- C++Dynamic Array动态数组(附完整源码)
Dynamic Array动态数组 Dynamic Array动态数组算法的完整源码(定义,实现,main函数测试) Dynamic Array动态数组算法的完整源码(定义,实现,main函数测试) ...
- C语言实现动态数组dynamic array(附完整源码)
C语言实现动态数组dynamic array 数组结构体的定义 实现以下7个接口 完整头文件 完整源文件 完整 main 测试文件 数组结构体的定义 typedef struct dynamic_ar ...
- 封装动态数组类Array
功能: 1.增.删.改.查 2.扩容.缩容 3.复杂度分析 4.均摊复杂度 5.复杂度震荡 分析动态数组的时间复杂度: 分析resize的时间复杂度: public class Array<E& ...
- vector,数组,动态数组效率测试
对vector.数组.new创建的动态数组.预先reverse的vector测试代码如下: #include <iostream> #include <vector> #inc ...
- C++动态数组再总结
动态数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组. 1.变长一维数组 实现变长数组最简单的是变长一维数组,你可以这样做: //文件名:array01.cpp#include ...
- python动态数组的最大值_python实现动态数组的示例代码
实现一个支持动态扩容的数组并完成其增删改查 #通过python实现动态数组 """ 数组特点: 占用一段连续的内存空间,支持随机(索引)访问,且时间复杂度为O(1) 添加 ...
- 动态数组怎么定义_Excel VBA 数组基础知识,初学者不可不学的关键知识
今天和大家要说的是VBA数组的基本知识点,等你学到后面就会知道,数组和字典搭配起来真的是事半功倍的啦!所以学习好数组的基本知识点也是必不可少的,基础知识有了,才能有后面的应用. 数组的基本概念 数组其 ...
- [unreal4入门系列之十五] UE4中的动态数组:TArray容器
为什么使用UE4提供的容器类? 如果你用过C++的STL库,你就知道STL提供了各种各样的容器/数据结构,使得你对处理很多数据的时候非常快捷高效.UE4同样也提供了类似的库,库里面的类型是以T开头的, ...
- nginx学习七 高级数据结构之动态数组ngx_array_t
1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性.比方实际上存储数据的区域也是一大块连续的内存. ...
最新文章
- 最喜欢随机森林?周志华团队DF21后,TensorFlow开源决策森林库TF-DF
- 战略资产配置matlab,资产组合有效前沿的解和最优解(MATLAB语言)
- 导出jar插件_利用类加载器解决不兼容的Jar包共存的问题
- 怎么在eclipse里调试WebDriver的源代码
- 科大星云诗社动态20201120
- Qt时间轴QTimeLine的基本用法
- python docx 设置表格字体和格式_python-docx修改已存在的Word文档的表格的字体格式方法...
- windows下安装php性能分析工具XHProf(windows版本)
- mini2440使用jlink烧写superboot到norflash
- C#算法设计排序篇之11-二叉树排序(附带动画演示程序)
- TypeError: 'float' object is not iterable
- 动态规划实战2-leetcode 62.unique path
- 共享打印机服务器脱机状态,打印机脱机工作怎么恢复 共享的打印机脱机状态...
- oracle中的start with connect by用法
- 3DMAX、C4D、Maya导出fbx到Unity设置
- 微信分享解决wx not defined
- Cesium加载各种互联网地图(一)
- Centos7.6 2T以上硬盘GPT分区工具使用挂载教程
- 一本好的“错题集”如何做?看这里
- 兆易创新笔试(5题)
热门文章
- 我与Java的故事(一次编写,“终生”运行)
- 009exec函数wait、waitpid回收子进程
- access exex控制pc_【转载】白话windows之 访问控制模型(Access Control Model)
- 关于Python的迭代操作
- 梅森素数_罗斯·梅森专访《 ule子3》的发行
- zhi hu7w阅读,如何人在家中坐,offer天上来!年薪百万,财务自由只是刚刚开始?(内容太过真实,Android高级工程师必经之路!)
- svn怎么执行清理命令_SHELL脚本定期删除日志文件(日志定期清理)
- 2022.02.22
- discuz导入mysql,discuz二次开发:分析和实现向dz数据库插入自己的帖子
- 数据清洗:去掉txt文件中有空缺值的行