前段时间一直忙着毕业设计,很久没有复习一些编程基础。即将毕业,趁着还有充足的时间,现在每天都在复习以及学习新的知识。前几天复习的是Java 中array的知识,正好趁着记忆有点模糊,来总结一下。PS 前几天学习的新东西是使用SpringBoot搭建个人博客,总的来说自己看着别人的源码,照着学习,还是学到了很多知识,但是因为找的学习资源不充分,因此博客项目的学习最后还是草草收工,代码已经上传到我的Github仓库了,有需要的小伙伴可以去下载看看。至少是可以从中学到很多知识,比如 权限管理的拦截器,前后端的连接调通,Mybatis知识的复习等等,非常多。

我新创建的一个专门复习的Java工程,也上传到了我的Github仓库没有需要的小伙伴们可以自行下载代码。
Fighting_Boss_Hao 的Github仓库

对此次复习的知识,数组部分的代码目录如下

首先是手写一个 通过索引操作无序数组

public class OperateWithIndex {private int[] datas = null;//定义数据private int currentIndex = 0;//定义索引public OperateWithIndex(int length) {datas = new int[length];}public int insert(int data) {datas[currentIndex] = data;currentIndex++;return currentIndex - 1;//这里是返回自增之前的添加索引}//删除就是从index开始,所有元素向后移一位public void remove(int index) {for (int i = index; i < currentIndex; i++) {datas[i] = datas[i + 1];}currentIndex--;}public int searchOne(int index) {return datas[index];}public void printDatas() {System.out.println("==================");for (int d : datas) {System.out.println(d);}}public static void main(String args[]) {OperateWithIndex op = new OperateWithIndex(20);op.insert(1);op.insert(3);op.insert(4);op.insert(6);op.insert(6);op.insert(7);op.printDatas();op.remove(3);op.printDatas();int result = op.searchOne(3);System.out.println("result : " + result);}
}

接下来 逐步演进, 第二个 是演示操作直接使用数据操作无无序数组,存放不重复的值
第二种 通过直接使用数据来操作无序数组,相比于第一种差别就是 它操作的是数据。多加的操作就是执行操作前先找到数据的索引,然后再进一步操作。

public class OperateNoIndex {private int[] datas = null;//定义数据private int currentIndex = 0;//定义索引public OperateNoIndex(int length) {datas = new int[length];}public int insert(int data) {datas[currentIndex] = data;currentIndex++;return currentIndex - 1;}public int getIndex(int data) {int index = -1;for (int j = 0; j < currentIndex; j++) {if (datas[j] == data) {index = j;break;}}return index;}public void remove(int data) {//1.查找这个数据对应的索引int index = getIndex(data);//2.同使用索引的而方法,由索引删除数据for (int i = index; i < currentIndex; i++) {datas[i] = datas[i + 1];}currentIndex--;}public int searchOne(int data) {//1.查找这个数据对应的索引int index = getIndex(data);//2.如果有,就返回datas中的数据if (index >=0) {return datas[index];}//3.如果没有,就返回0;return 0;}public void printDatas() {System.out.println("==================");for (int d : datas) {System.out.println(d);}}public static void main(String args[]) {OperateNoIndex op = new OperateNoIndex(20);op.insert(1);op.insert(3);op.insert(4);op.insert(6);op.insert(7);op.printDatas();op.remove(3);op.printDatas();int result = op.searchOne(3);System.out.println("result : " + result);}
}

第三种 演示操作直接使用数据操作无无序数组,* 存放重复的值
第三种相较于第二种,主要是可以存放重复的值,需要多做的操作就是对操做的结果要循环的执行,找出所有的结果。

public class OperateNoIndexRepetable {private int[] datas = null;//定义数据private int currentIndex = 0;//定义索引public OperateNoIndexRepetable(int length) {datas = new int[length];}public int insert(int data) {datas[currentIndex] = data;currentIndex++;return currentIndex - 1;}
/***获取数据data在数组中的索引位置* begin 开始查找的位置* data  查找索引的数据* return 从开始位置往后的第一个索引*/public int getIndex(int begin,int data) {int index = -1;for (int j = begin; j < currentIndex; j++) {if (datas[j] == data) {index = j;break;}}return index;}public void remove(int data) {//1.查找这个数据对应的索引int index = getIndex(0,data);//循环向后查找这个索引,直到找不到为止while(index>=0){//2.同使用索引的而方法,由索引删除数据 这里要注意的是 这个循环是从尾部开始,为前边                  // index对应的data让出位置,依次向后移动for (int i = index; i < currentIndex; i++) {datas[i] = datas[i + 1];}currentIndex--;//再次查找后续的数据对应的索引index= getIndex(index,data);}}public List<Integer> searchOne(int data) {List<Integer> reList =  new ArrayList<>();//1.查找这个数据对应的索引int index = getIndex(0,data);while(index>=0){//2.如果有,就添加到要返回的集合中reList.add(datas[index]);//再次查找后续的数据对应的索引index= getIndex(index+1,data);}return reList;}public void printDatas() {System.out.println("==================");for (int d : datas) {System.out.println(d);}}public static void main(String args[]) {OperateNoIndexRepetable op = new OperateNoIndexRepetable(20);op.insert(1);op.insert(3);op.insert(3);op.insert(4);op.insert(6);op.insert(6);op.insert(7);op.printDatas();op.remove(3);op.printDatas();List<Integer> result = op.searchOne(6);System.out.println("result : " + result);}
}

第四种 是演示操作直接使用数据操作有序数组,存放不重复的值
第四种操作的是有序数组,因此对于数据的插入操作需要先进行排序。对于删除和查找则是循环的比较

public class OperateOrderNoIndex {private int[] datas = null;//定义数据private int currentIndex = 0;//定义索引public OperateOrderNoIndex(int length) {datas = new int[length];}public int insert(int data) {//假设顺序是升序int index =0;//1.查找数据data应该存放的位置for (index=0;index<currentIndex;index++){if(datas[index]>data){break;}}//2.把这个位置及其后面的数据,向后移动一位for (int i =currentIndex;i>index;i--){datas[i]=datas[i-1];}//3.把data设置到应该存放的位置datas[index] = data;currentIndex++;return currentIndex -1;//返回自增前的地址}public int getIndex(int data) {int index = -1;for (int j = 0; j < currentIndex; j++) {if (datas[j] == data) {index = j;break;}}return index;}public void remove(int data) {//1.查找这个数据对应的索引int index = getIndex(data);//2.同使用索引的而方法,由索引删除数据for (int i = index; i < currentIndex; i++) {datas[i] = datas[i + 1];}currentIndex--;}public int searchOne(int data) {//1.查找这个数据对应的索引int index = getIndex(data);//2.如果有,就返回datas中的数据if (index >=0) {return datas[index];}//3.如果没有,就返回0;return 0;}public void printDatas() {System.out.println("==================");for (int d : datas) {System.out.println(d);}}public static void main(String args[]) {OperateOrderNoIndex op = new OperateOrderNoIndex(20);op.insert(1);op.insert(3);op.insert(4);op.insert(6);op.insert(7);op.printDatas();op.remove(3);op.printDatas();int result = op.searchOne(3);System.out.println("result : " + result);}
}

第五种 是 演示操作直接使用数据操作有序数组,* 存放重复的值

重点就是 有序数组,重复的值

此方法,和第四种几乎没变

public class OperateOrderNoIndexRepetable {private int[] datas = null;//定义数据private int currentIndex = 0;//定义索引public OperateOrderNoIndexRepetable(int length) {datas = new int[length];}public int insert(int data) {//假设顺序是升序int index =0;//1.查找数据data应该存放的位置for (index=0;index<currentIndex;index++){if(datas[index]>data){break;}}//2.把这个位置及其后面的数据,向后移动一位for (int i =currentIndex;i>index;i--){datas[i]=datas[i-1];}//3.把data设置到应该存放的位置datas[index] = data;currentIndex++;return currentIndex -1;//返回自增前的地址}
/***获取数据data在数组中的索引位置* begin 开始查找的位置* data  查找索引的数据* return 从开始位置往后的第一个索引*/public int getIndex(int begin,int data) {int index = -1;for (int j = begin; j < currentIndex; j++) {if (datas[j] == data) {index = j;break;}}return index;}public void remove(int data) {//1.查找这个数据对应的索引int index = getIndex(0,data);//循环向后查找这个方法,直到找不到为止while(index>=0){//2.同使用索引的方法,由索引删除数据for (int i = index; i < currentIndex; i++) {datas[i] = datas[i + 1];}currentIndex--;//再次查找后续的数据对应的索引index= getIndex(index,data);}}public List<Integer> searchOne(int data) {List<Integer> reList =  new ArrayList<>();//1.查找这个数据对应的索引int index = getIndex(0,data);while(index>=0){//2.如果有,就添加到要返回的集合中reList.add(datas[index]);//再次查找后续的数据对应的索引index= getIndex(index+1,data);}return reList;}public void printDatas() {System.out.println("==================");for (int d : datas) {System.out.println(d);}}public static void main(String args[]) {OperateOrderNoIndexRepetable op = new OperateOrderNoIndexRepetable(20);op.insert(1);op.insert(3);op.insert(3);op.insert(4);op.insert(6);op.insert(6);op.insert(7);op.printDatas();op.remove(3);op.printDatas();List<Integer> result = op.searchOne(6);System.out.println("result : " + result);}
}

第六种 将操作对象换成 Object
1.先创建一个Model ,排序用到的是其属性UUID
2.将对象换到代码中去

public class UserModel1 {private int uuid;private String name;private int age;public UserModel1(int uuid, String name, int age) {this.uuid = uuid;this.name = name;this.age = age;}public int getUuid() {return uuid;}public void setUuid(int uuid) {this.uuid = uuid;}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 "UserModel1{" +"uuid=" + uuid +", name='" + name + '\'' +", age=" + age +'}';}
}
public class OperateOrderNoIndexObject {private UserModel1[] datas = null;//定义数据private int currentIndex = 0;//定义索引public OperateOrderNoIndexObject(int length) {datas = new UserModel1[length];}public int insert(UserModel1 data) {//假设顺序是升序int index = 0;//1.查找数据data应该存放的位置for (index = 0; index < currentIndex; index++) {if (datas[index].getUuid() > data.getUuid()) {break;}}//2.把这个位置及其后面的数据,向后移动一位for (int i = currentIndex; i > index; i--) {datas[i] = datas[i - 1];}//3.把data设置到应该存放的位置datas[index] = data;currentIndex++;return currentIndex - 1;//返回自增前的地址}public int getIndex(int uuid) {int index = -1;for (int j = 0; j < currentIndex; j++) {if (datas[j].getUuid() == uuid) {index = j;break;}}return index;}public void remove(int uuid) {//1.查找这个数据对应的索引int index = getIndex(uuid);//2.同使用索引的而方法,由索引删除数据for (int i = index; i < currentIndex; i++) {datas[i] = datas[i + 1];}currentIndex--;}public UserModel1 searchOne(int uuid) {//1.查找这个数据对应的索引int index = getIndex(uuid);//2.如果有,就返回datas中的数据if (index >= 0) {return datas[index];}//3.如果没有,就返回null;return null;}public void printDatas() {System.out.println("==================");for (UserModel1 d : datas) {System.out.println(d);}}public static void main(String args[]) {OperateOrderNoIndexObject op = new OperateOrderNoIndexObject(10);op.insert(new UserModel1(1,"张三",6));op.insert(new UserModel1(2,"haha",7));op.insert(new UserModel1(3,"李四",6));op.insert(new UserModel1(6,"呱呱",5));op.insert(new UserModel1(7,"唧唧",3));op.insert(new UserModel1(4,"啦啦",16));op.remove(3);op.printDatas();UserModel1 model1 = op.searchOne(4);System.out.println("result : " + model1);}
}

最后可以利用第五重数据的代码,稍加修改写一个二分查找算法

public class OperateOrderNoIndexBinarySearch {private int[] datas = null;//定义数据private int currentIndex = 0;//定义索引public OperateOrderNoIndexBinarySearch(int length) {datas = new int[length];}public int insert(int data) {//假设顺序是升序int index =0;//1.查找数据data应该存放的位置。for (index=0;index<currentIndex;index++){if(datas[index]>data){break;}}//2.把这个位置及其后面的数据,向后移动一位。for (int i =currentIndex;i>index;i--){datas[i]=datas[i-1];}//3.把data设置到应该存放的位置。datas[index] = data;currentIndex++;return currentIndex -1;//返回自增前的地址}public int binarySearch(int data) {int index = -1;//用来表示小的这边的索引int lowIndex=0;//用来表示大的这边的索引int highIndex=currentIndex-1;//因为插入的时候最后的索引是++while(true){//1.找到中间的位置index= ( lowIndex + highIndex )/2;//2.把要查找的数据和中间索引位置的数据进行比较if(lowIndex>highIndex){//没找到数据return -1;}else if(datas[index]==data){return index;}else{if (data<datas[index]) {highIndex = index-1;}else{lowIndex = index +1;}}}}public void printDatas() {System.out.println("==================");for (int d : datas) {System.out.println(d);}}public static void main(String args[]) {OperateOrderNoIndexBinarySearch op = new OperateOrderNoIndexBinarySearch(20);op.insert(1);op.insert(3);op.insert(4);op.insert(6);op.insert(7);op.printDatas();int i = op.binarySearch(4);System.out.println("result index is :"+ i);}
}

哦了,过了一遍代码,又复习了一遍。对于所实现的数据,仅仅是简单的实现,并没有考虑一下边界值等。 接下来该复习今天的知识,以及学习新的知识。

复习总结并手写常用数据结构--数组相关推荐

  1. C语言手写自定义三维数组

    C语言手写三维数组 本文目的是通过C语言的结构体和动态数组,实现自定义类型的三维数组TripleArray及其基本运算 本文目的是通过C语言的结构体和动态数组,实现自定义类型的三维数组TripleAr ...

  2. 《数据库系统原理及应用教程》期末复习知识点整理手写资料(Ch1-Ch5)

    阅读前注意: 1. 本复习资料配套书目<数据库系统原理及应用教程>(苗雪兰等,第五版) ,是对应于课程"数据库原理及应用(专业选修课)"的期末复习知识点归纳总结手写笔记 ...

  3. 西电计网期末复习要点+iPad手写笔记

    本人计网94,下面是我当时复习的时候整理的笔记,供各位学弟学妹参考.

  4. java 数组 重复数据结构_常用数据结构及其Java实现——刷了一个月算法,薪资终于Double了!...

    大家五一假期回来还愉快吗?我就问问而已 本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践 ...

  5. java set第n位_数据结构与算法——常用数据结构及其Java实现

    本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...

  6. 手写JavaScript

    导出TXT文件 <!DOCTYPE html> <html><head><meta charset="utf-8"><titl ...

  7. 风尚云网面试题系列—JS高频手写代码题

    目录 实现 Promise 实现一个 call 函数 实现一个 apply 函数 实现一个 bind 函数 浅拷贝.深拷贝的实现 实现一个防抖函数 实现一个节流函数 柯里化函数的实现 Object.c ...

  8. 【每日手写JS代码】

    文章目录 一. 手写JS 1-1 数组方法 1月5号 数组扁平化 1月6号 Array.prototype.map() 1月7号 Array.prototype.filter() 1月8号 Array ...

  9. 数据结构与算法+JVM调优和GC常用算法+数据库高级+复杂sql手写

    数据结构 双向链表 二叉排序树 红黑树 散列表 双向链表: 什么是双向链表 双向链表是一种数据结构,是由若干个节点构成,每个节点由三部分构成, 分别是前驱节点,元素,后继节点,且双向链表中的节点在内存 ...

最新文章

  1. Fedora install chrome
  2. 删除有序vector中的重复值c++
  3. [MySQL光速入门]012 作业解答
  4. 《Python Cookbook 3rd》笔记(1.7):字典排序
  5. ionic cordova 常用命令
  6. jquery easy ui 1.3.4 窗口,对话框,提示框(5)
  7. linux查看usb设备名称,Linux系统下查看USB设备名及使用USB设备
  8. Linux卸载JDK的方法
  9. 【自动驾驶】ROS机器人操作系统总结
  10. C++语音信号时域分析
  11. icem网格数和节点数_ansys中划分网格后,如何查看单元数和节点数
  12. 荣耀8 google play store 安装程序
  13. Java Logging之JUL系列——Handler
  14. 计算机的奇迹英语作文,高中英语作文范文:奇迹
  15. 已成功与服务器建立连接,但是在登录过程中发生错误。
  16. Cesium基础知识-添加天空盒
  17. inspects a maven model for resolution problems
  18. C4D骨骼绑定和骨骼动画
  19. 利用tensorflow神经网络进行泰坦尼克的生存预测
  20. jsp+ssh2+mysql实现的CRM客户关系管理系统

热门文章

  1. 盖尔金圆定理及严格对角占优矩阵(SDD) 1
  2. 浅析硬件“好声音”:麦克风技术指标及选型指南
  3. 两万字摘录计算机博士生涯规划
  4. 使用ssh公钥实现免密码登录
  5. evo安装,使用及报错处理
  6. Windows 安装Kali等Linux子系统
  7. oracle数据库应用与实践课件,Oracle数据库管理、开发与实践 教学课件 作者 杨永健 刘尚毅 第6章 PL SQL编程.ppt...
  8. 高效的大型时间序列数据压缩方法 MidiMax 压缩算法 | 让时间序列可视化更容易
  9. 计算机休眠移动硬盘不休眠,硬盘盒关闭自动休眠功能操作说明
  10. python爬历年大学生就业数据_2018 年大学生就业形势数据分析报告.PDF