当前位置:   article > 正文

【Java--数据结构】模拟实现ArrayList

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

LIst

顺序表ArrayList

顺序表优点

IList接口

ArrayList中定义要操作的数组

在MyArrayList中 重写接口方法

新增元素

在指定位置插入元素

 pos不合法异常

判断和查找元素

获取和更新元素

删除元素和清空顺序表

获取顺序表的长度和打印顺序表


LIst

List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。

  • ArrayList:实现了List接口,底层为动态类型顺序表
  • LinkedList:实现了List接口,底层为双向链表

 Java类和接口总览

顺序表ArrayList

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成 数据的增删查改。

顺序表优点

适合根据 下标进行 查找 和 更新 的场景

访问速度比较快(在给定下标的情况下可以达到O(1)

下面我们要自己模拟实现一个 顺序表MyArrayList,理解它底层的数据结构原理,方便我们未来更好的使用ArrayList中的方法。

IList接口

  1. package arrayList;
  2. public interface IList {
  3. // 新增元素,默认在数组最后新增
  4. void add(int data);
  5. // 在 pos 位置新增元素
  6. void add(int pos, int data) ;
  7. // 判定是否包含某个元素
  8. boolean contains(int toFind);
  9. // 查找某个元素对应的位置
  10. int indexOf(int toFind) ;
  11. // 获取 pos 位置的元素
  12. int get(int pos) ;
  13. //给 pos 位置的元素设为 value
  14. void set(int pos, int value) ;
  15. //删除第一次出现的关键字key
  16. void remove(int toRemove) ;
  17. // 获取顺序表长度
  18. int size() ;
  19. // 清空顺序表
  20. void clear();
  21. // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
  22. void display() ;
  23. boolean isFull();
  24. }

ArrayList中定义要操作的数组

  1. package arrayList;
  2. import java.util.Arrays;
  3. //定义顺序表,实现IList 接口
  4. public class MyArrayList implements IList{
  5. //定义要操作的数组
  6. public int[]elem;
  7. public int usedSize;//数组中存储的数据个数
  8. public MyArrayList(){
  9. this.elem=new int[10];//表示数组长度是10
  10. }

在MyArrayList中 重写接口方法

新增元素

  1. @Override // 新增元素,默认在数组最后新增
  2. public void add(int data) {
  3. //如果满了,要扩容
  4. if(isFull()){
  5. //扩容
  6. elem= Arrays.copyOf(elem,2*elem.length);
  7. }
  8. this.elem[usedSize]=data;
  9. this.usedSize++;
  10. }
  11. @Override//用于判断顺序表是否满了
  12. public boolean isFull() {
  13. return usedSize==elem.length;
  14. }

在指定位置插入元素

  1. @Override // 在 pos 位置新增元素
  2. public void add(int pos, int data) {
  3. //插入数据的时候一定要保证插入的位置前面有数据
  4. try{
  5. checkPosOfAdd(pos);
  6. }catch (PosNotLegalException e){
  7. e.printStackTrace();
  8. }
  9. //判断是否满了
  10. if(isFull()){
  11. elem= Arrays.copyOf(elem,2*elem.length);
  12. }
  13. //移动元素
  14. for (int i = usedSize-1; i>=pos ; i--) {
  15. elem[i+1]=elem[i];
  16. }
  17. //插入元素
  18. elem[pos]=data;
  19. usedSize++;
  20. }
  21. //该方法用来 判断添加元素时 pos是否合法
  22. private void checkPosOfAdd(int pos){
  23. if(pos<0||pos>usedSize){
  24. throw new PosNotLegalException("在pos位置插入元素时Pos位置不合法。。。");//抛出一个异常
  25. }
  26. }

 pos不合法异常

  1. package arrayList;
  2. //定义一个异常,用于对pos不合法时的报警
  3. public class PosNotLegalException extends RuntimeException{
  4. public PosNotLegalException(){
  5. }
  6. public PosNotLegalException(String msg){
  7. super(msg);
  8. }
  9. }

判断和查找元素

  1. @Override // 判定是否包含某个元素
  2. public boolean contains(int toFind) {
  3. //只需要找usedSize次
  4. for (int i = 0; i < usedSize; i++) {
  5. if(elem[i]==toFind){
  6. return true;
  7. }
  8. }
  9. return false;
  10. }
  11. @Override // 查找某个元素对应的位置
  12. public int indexOf(int toFind) {
  13. for (int i = 0; i < usedSize; i++) {
  14. if(elem[i]==toFind){
  15. return i;//与上面contains方法的代码一样,只是返回的是下标
  16. }
  17. }
  18. return -1;
  19. }

获取和更新元素

  1. //get/set时,判断pos是否合法
  2. private void checkPosOfGet(int pos)throws PosNotLegalException{
  3. if(pos<0||pos>=usedSize){
  4. throw new PosNotLegalException("get/set获取元素的时候pos位置不合法。。。");
  5. }
  6. }
  7. @Override // 获取 pos 位置的元素
  8. public int get(int pos) {
  9. try{
  10. checkPosOfGet(pos);
  11. }catch (PosNotLegalException e){
  12. e.printStackTrace();
  13. }
  14. return elem[pos];
  15. }
  16. @Override //给 pos 位置的元素设为 value 更新pos位置的值为value
  17. public void set(int pos, int value) {
  18. try{
  19. checkPosOfGet(pos);
  20. }catch (PosNotLegalException e){
  21. e.printStackTrace();
  22. }
  23. elem[pos]=value;
  24. }

删除元素和清空顺序表

  1. @Override //删除第一次出现的关键字key
  2. public void remove(int toRemove) {
  3. //要查找是否查找要删除的关键字 toRemove
  4. int pos =indexOf(toRemove);
  5. if(pos==-1){
  6. System.out.println("没有要删除的数字!");
  7. return;
  8. }
  9. for (int i = 0; i < usedSize-1; i++) {
  10. elem[i]=elem[i+1];
  11. }
  12. usedSize--;
  13. }
  14. @Override // 清空顺序表
  15. public void clear() {
  16. //1.如果是数组元素,直接将usedSize置为0
  17. //2.如果是引用类型,则置为null
  18. /* for (int i = 0; i < usedSize; i++) {
  19. elem[i]=null;
  20. }*/
  21. usedSize=0;//这里是数组
  22. }

获取顺序表的长度和打印顺序表

  1. @Override // 获取顺序表长度
  2. public int size() {
  3. return usedSize;
  4. }
  5. @Override //打印顺序表
  6. public void display() {
  7. for (int i = 0; i < usedSize; i++) {
  8. System.out.print(elem[i]+" ");
  9. }
  10. System.out.println();
  11. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/497173
推荐阅读
相关标签
  

闽ICP备14008679号