【java版数据结构】看完数据结构的顺序结构后,紧接着去实现ArrayList的底层(150行代码,数组扩容,增删改查,但未实现迭代器)
实现效果:
需求分析:
可以看到ArrayList容器有很多功能,在指定位置添加元素,在容器末尾添加元素,获取指定位置的元素,获取容器的大小,清空容器的元素,判断容器是否是空的,删除指定位置的元素,删除某一元素等等
现要求同学们把容器的主要功能用数组实现
思维:我们都知道,数组是不可变的,一个数组在被创建的时候,其长度就已经固定住了,不能再改变,但是我们想要往数组里面不断的添加元素,实现ArrayList的效果,这时候我们可以用到数组扩容的思维,其主要思想是,新建一个比当前数组大的数组,将旧数组的元素全部复制到新数组中,新数组中多出来的空位就可添加元素,最后用新数组覆盖旧数组(简而言之,借助了一个较大数组,实现了扩容)具体实例可看下方代码
换言之,我们要实现删除功能,只要创建一个比当前数组小的新数组,再有选择的复制除删除元素之外的其他元素 到新数组中,最后用新数组替换旧数组
//需求:
// 在长度为6的数组[1,2,3,4,5,6]后加上[7,8,9]
// 变成[1,2,3,4,5,6,7,8,9]
// Arrays.toString(<?>[])方法打印数组内容
public class ArrayExpand {public static void main(String[] args) {int [] array=new int[6];//赋值for (int i=0;i<array.length;i++) {array[i]=i+1;}System.out.println("array:"+Arrays.toString(array));int [] des=new int[]{7,8,9};//数组扩容3个长度System.out.println("des:"+Arrays.toString(des));int [] newArray=new int [array.length+des.length];//旧数组赋值到新数组for (int i = 0; i <array.length ; i++) {newArray[i]=array[i];}//要连接的数组赋值到新数组for (int i = 0; i <des.length; i++) {newArray[array.length+i]=des[i];}//新数组替换旧数组array=newArray;//在java中数组也是一个类,每个类都有toString函数System.out.println("array:"+Arrays.toString(array));}
}
功能图:
功能实现代码:
package 线性结构.数组;import java.util.Arrays;/*** @ProjectName 数据结构* @ClassName Array* @Description //面向对象的数组,实现增删改查(ArrayList底层实现)* @Email 2992794262@qq.com* @Author ASUS* @Date 2021/11/11**/
public class Array {private static Object [] array;//构造方法,初始化数组public Array() {array=new Object[0];}//返回数组长度public int size(){return array.length;}//显示数组public void show(){System.out.println(Arrays.toString(array));}//在数组最后增加元素public void add(Object element){Object [] newArray=new Object[array.length+1];//旧数组复制到新数组for (int i = 0; i <array.length ; i++) {newArray[i]=array[i];}newArray[newArray.length-1]=element;//新数组替换旧数组array=newArray;}//在指定位置插入元素public void add(int index,Object element){//创建一个新的数组Object newArray[]=new Object[array.length+1];//将原数组中的元素放入新数组中for (int i = 0; i < newArray.length; i++) {if(index<0 ||index > array.length-1){throw new RuntimeException("下标越界");}else{//在插入位置之前if (i<index){newArray[i]=array[i];}//在插入位置之后else if(i>index){newArray[i]=array[i-1];}else{newArray[i]=element;}}}//新数组替换旧数组sarray=newArray;}//删除数组的最后一个元素public static void delete(){//创建一个新的数组Object[]newArray=new Object[array.length-1];//将原数组除最后一个元素之外的其他元素放入新数组中for (int i = 0; i <array.length-1 ; i++) {newArray[i]=array[i];}//新数组替换旧数组array=newArray;}//删除某个位置的元素public void delete(int index){Object [] newArray=new Object[array.length-1];for (int i = 0; i <newArray.length ; i++) {if(index<0 ||index > array.length-1){throw new RuntimeException("下标越界");}else{//在指定位置之前if(i<index){newArray[i]=array[i];}//在指定位置之后else{newArray[i]=array[i+1];}}}//新数组替换旧数组array=newArray;}//替换指定位置public void set(int index,Object element){array[index]=element;}//查询指定位置的元素public Object get(int index){return array[index];}//线性查找算法实现indexOf底层,返回参数第一次出现的位置public int indexOf(Object element){//没找到返回-1int index=-1;for (int i = 0; i <array.length; i++) {if (array[i].equals(element)){index= i;break;}}return index;}//清空数组功能public void clear(){Array a=new Array();//把当前的对象的属性数组变成当前对象a.array=array;for (int i = 0; i <array.length ; i++) {a.delete();}}//判空功能public boolean isEmpty(){if (array.length==0){return true;}elsereturn false;}
}
测试类:
package 线性结构.数组;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @ProjectName 数据结构* @ClassName TestArray* @Description //* @Email 2992794262@qq.com* @Author ASUS* @Date 2021/11/11**/
public class TestArray {public static void main(String[] args) {Array array=new Array();while(true){System.out.println("1.查看数组大小\t2.判断数组是否为空\t\t3.打印数组元素\t4.清空数组");System.out.println("5.在末尾添加元素\t6.在指定位置添加元素\t7.删除末尾元素\t8.删除指定位置元素");System.out.println("9.替换指定位置元素\t10.查询指定位置元素\t11.获取指定元素第一次出现的下标\t12.退出");Scanner input=new Scanner(System.in);int n=input.nextInt();switch(n){case 1:System.out.println("size = "+array.size());break;case 2:System.out.println("数组是空的 : "+array.isEmpty());break;case 3:array.show();break;case 4:array.clear();System.out.println("数组已清空");break;case 5:System.out.print("请输入你要添加的元素: ");Object element=input.next();array.add(element);System.out.println("添加成功");break;case 6:System.out.print("请输入你要添加的位置: ");int index=input.nextInt();System.out.print("请输入你要添加的元素: ");Object object=input.next();array.add(index,object);System.out.println("添加成功");break;case 7:array.delete();System.out.println("删除成功");break;case 8:System.out.print("请输入你要删除元素的指定位置: ");int i=input.nextInt();array.delete(i);System.out.println("删除成功");break;case 9:System.out.print("请输入你要替换的元素的下标: ");int j=input.nextInt();System.out.print("请输入你要替换的新元素: ");Object object1=input.next();array.set(j,object1);System.out.println("替换成功");break;case 10:System.out.print("请输入你要查询的元素的下标: ");int k=input.nextInt();System.out.println("查询结果:"+array.get(k));break;case 11:System.out.print("请输入你要查询的元素: ");Object object2=input.next();int first=array.indexOf(object2);System.out.println("第一次出现的位置是:"+first);break;default:System.exit(0);}}}
}
【java版数据结构】看完数据结构的顺序结构后,紧接着去实现ArrayList的底层(150行代码,数组扩容,增删改查,但未实现迭代器)相关推荐
- java中的数组增删查改操作,java数组实现增删改查
java 实现动态数组,Java工具类Arrays中不得不知的常用方法,数组实现队列java,java数组实现增删改查 java 增删改查代码 import java.sql.Connection; ...
- java里SQL insert操作的语法_Java含个人总结语法:JDBC,学生表,实体类,集合,增删改查,注入,预处理【诗书画唱】...
create table denglu( uname varchar(30), upwd varchar(30) ) insert into denglu values('诗书','123') ins ...
- Java程序员除了做增删改查还能干嘛?
就以Java后端开发为例,说说不同级别程序员干的事情. 1 初级开发,大概是有3年Java开发经验. 22年底,上海,这批程序员如果学历是本科,薪资一般是8k到2w,当然如果能进好公司或互联网大厂,薪 ...
- java中容器里的增删改查_Java工程师的第八天——简单的增删改查的应用
package day08; import java.util.Scanner; /** * * @author sun changxin * 习题:数组完成增删改查(CRUD) 1.字符串类型的数组 ...
- 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】
文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...
- (数据结构与算法)单链表与双链表增删改查的实现。
文章目录 链表介绍 1. 单链表应用实例 1.1 实现思路 1.2 代码实现 2.单链表常见面试题 2.1 求单链表中有效节点的个数 2.2 查找单链表中倒数第K个节点 2.3 单链表的反转 2.4 ...
- 通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现
文章目录 节点类 链表类(主要) 测试类 小结 节点类 可以根据需要,对节点属性进行修改.注意重写toString()方法,以便后续的输出操作. //节点类 class Node {public in ...
- 我在名牌大学毕业后的经历 (看完感动,涌动,后泪流)
我在名牌大学毕业后的经历 (看完感动,涌动,后泪流) 我是82年,大学毕业3年5个月.现在一家大型市场咨询公司,自己带一个组,月薪16000,未算其他收入与分红.也就是传统意义上的白领打工仔.在北京, ...
- 学生管理系统(Java版)(普通版(增删改查)、增强版(登录、注册、忘记密码))
普通版需求如下: 学生管理系统分为四个部分:增删改查 主菜单: 增部分:(在增加前,我们要判断id的唯一性,因此我们可以遍历ArrayList数组,再调用String的equals方法,进行判断) 删 ...
最新文章
- c语言 字符串 url,如何对URL字符串进行百分号编码
- 杭电acm 2024 C语言合法标识符
- 记录一次手机联系人整理(XML文件格式处理)
- 《21天学通Java(第6版)》—— 1.7 问与答
- windows 删除php,windows软链接(mklink)的建立及删除的用法示例
- windows 清除记录ftp账号
- 039.有符号数除法
- AI:人工智能领域之国内外人工智能产业应用图谱应用层/基础层详解—AI八大应用领域之医疗/家居/驾驶/零售/城市/教育/金融/交通、(AI三大基础(算法【计算机视觉/自然语言处理/机器学习、科研院所/
- QT框架下的OpenGL使用---实战篇---鼠标选取点对象
- 2006-10-30 18:37:00 著名Linux内核程序员大鹰 ox啊
- 动态规划旅游问题:汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案。
- 板块分析:筑底阶段 智能家居开启蓝海
- 根据股票代码特征分类
- 系统封装Win10专业版1803
- 央视网采用国产8K摄像机直播2022年度最大超级月亮
- python——用Turtle画画写名字
- 攻防世界--进阶区--forgot
- 软件开发基础知识(1)
- 应届生找嵌入式工作难吗?
- 电脑在线如何一键重装win10系统?电脑在线一键重装系统win10步骤
热门文章
- 如何用卷积神经网络预测股票波动率?(附Python代码)
- fluent linux运行算例,Fluent算例精选|03利用VOF和蒸发-冷凝模型
- 台式计算机连不上网,台式电脑连接不上网络怎么办
- java语言中的合法的变量名_合法的变量名
- linux恢复rm命令,Linux系统下不小心使用rm命令删除的文件能有办法恢復吗?
- 机器人的发展及其概述
- linux中more命令的意思,linux中的more命令的详细解释
- 色彩标准709loghlg
- Android开发之Compose基础学习-Divider分割线控件的基本用法
- 信息系统监理师(二)