当前位置: 首页 > article >正文

【Java】实现顺序表基本的操作(数据结构)

文章目录

  • 前言
  • 顺序表
  • 1、打印顺序表
  • 2、增加元素
  • 3、在任意位置增加元素
  • 4、判断是否包含某个元素
  • 5、查找某个元素对于的位置
  • 6、获取任意位置的元素
  • 7、将任意位置的元素设为value
  • 8、删除第一次出现的关键字
  • 9、获取顺序表长度
  • 10、清空顺序表
  • 总结


前言

在了解顺序表之前我们要先了解什么是线性表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储


顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改
在这里插入图片描述
接下来我们要实现一些方法来对数组进行增删查改等操作

创建一个类:

public class MyArrayList {
    //数组
    public int[] elem;
    //数组中的元素个数
    public int usedSize;
    //当前数组默认的容量
    public static final int DEFAULT_CAPACITY = 5;
    public MyArrayList() {
        elem = new int[DEFAULT_CAPACITY];
    }
}    

1、打印顺序表

public void display() {
    for (int i = 0; i < usedSize; i++) {
        System.out.print(elem[i]+" ");
    }
    System.out.println();
}  

2、增加元素

增加元素默认是在数组的最后位置增加元素
在增加元素之前我们要先判断数组是否满了

判读数组是否满:

public boolean isFull() {
    return usedSize == elem.length;
}

增加元素:

public void add(int data) {
    if(isFull()) {
        //满了进行扩容
        elem = Arrays.copyOf(elem,2*elem.length);
    }
    elem[usedSize] = data;
    usedSize++;
}

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        myArray.display();
    }
}

在这里插入图片描述

3、在任意位置增加元素

注意:这里的增加元素要保证位置的合法性不能小于0,也不能大于数组的长度,更不能间隔着插入,即插入的位置前面一定要有元素;同时插入时其余元素要后移;如果不合法就抛一个异常
同样增加元素之前我们要判断数组是否满了

位置是否合法:

private void checkPosOfAdd(int pos) {
    if(pos < 0||pos > usedSize) {
        throw new PosException("pos位置不合法:"+pos);
    }
}  

任意位置增加元素:

public void add(int pos, int data) {
    //判断位置是否合法
    checkPosOfAdd(pos);
    if(isFull()) {
        elem = Arrays.copyOf(elem,2*elem.length);
    }
    for (int i = usedSize - 1; i >= pos; i--) {
        elem[i+1] = elem[i];
    }
    elem[pos] = data;
    usedSize++;
}    

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        myArray.add(1,15);
        myArray.display();
    }
}

在这里插入图片描述

4、判断是否包含某个元素

遍历数组判断是否与这个元素相同:

public boolean contains(int toFind) {
    for (int i = 0; i < usedSize; i++) {
        if(elem[i] == toFind) {
            return true;
        }
    }
    return false;
}    

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        System.out.println(myArray.contains(20));
        System.out.println(myArray.contains(200));
    }
}

在这里插入图片描述

5、查找某个元素对于的位置

遍历这个数组找与要查找的元素是否相同,相同返回该元素的下标,不同返回-1:

public boolean indexOf(int toFind) {
    for (int i = 0; i < usedSize; i++) {
        if(elem[i] == toFind) {
            return i;
        }
    }
    return -1;
}  

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        System.out.println(myArray.indexOf(20));
        System.out.println(myArray.indexOf(200));
    }
}

在这里插入图片描述

6、获取任意位置的元素

同样我们要判断该位置是否合法,还有要判断顺序表是否为空,两个条件都合法时返回该位置的元素

顺序表是否为空:

public boolean isEmpty() {
    return usedSize == 0;
} 

获取任意位置的元素:

public int get(int pos) {
    //判断该位置是否合法
    checkPosOfAdd(pos);
    if(isEmpty()) {
        throw new EmptyException("顺序表为空");
    }
    return elem[pos];
}    

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        System.out.println(myArray.get(1));
    }
}

在这里插入图片描述

7、将任意位置的元素设为value

与获取任意位置的元素方法相同,要判断该位置是否合法,还要判断顺序表是否为空

将任意位置的元素设为value:

public void set(int pos, int value) {
    //判断位置是否合法
    checkPosOfAdd(pos);
    if(isEmpty()) {
        	throw  new EmptyException("顺序表为空");
    }
    this.elem[pos] = value;
}    

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        myArray.set(1,15);
        myArray.display();
    }
}

在这里插入图片描述

8、删除第一次出现的关键字

在进行删除操作时要判断顺序表是否为空,找到要删除元素的下标,最后
挪动数据

删除操作:

 public void remove(int toRemove) {
     if(isEmpty()) {
         throw new EmptyException("顺序表为空");
     }
     int ret = indexOf(toRemove);
     for (int i = ret; i < usedSize; i++) {
         elem[i] = elem[i+1];
     }
     usedSize--;
}    

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        myArray.remove(10);
        myArray.display();
    }
}

在这里插入图片描述

9、获取顺序表长度

public int size() {
    return usedSize;
}    

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        System.out.println(myArray.size());
    }
}

在这里插入图片描述

10、清空顺序表

public void clear() {
    usedSize = 0;
}    

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList myArray = new MyArrayList();
        myArray.add(10);
        myArray.add(20);
        myArray.add(30);
        myArray.add(40);
        myArray.display();
        System.out.println("*******");
        myArray.clear();
        myArray.display();
    }
}

在这里插入图片描述


总结

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
在这里插入图片描述
1.ArrayList是以泛型方式实现的,使用时必须要先实例化
2.ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
3.ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
4.ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
5.和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者
CopyOnWriteArrayList
6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表


http://www.kler.cn/a/160804.html

相关文章:

  • Linux学习笔记之组管理和权限管理
  • 动态规划---解决多段图问题
  • Kafka 快速入门(一)
  • 数据库基础(14) . MySQL存储过程
  • Android中Activity启动的模式
  • 蓝桥杯-洛谷刷题-day2(C++)
  • Pytorch CIFAR10图像分类 ShuffleNetv2篇
  • Java数据结构之《构造哈夫曼树》(难度系数85)
  • Java多线程技术二:线程间通信——InheritableThreadLocal的使用
  • BGP/Border Gateway Protocol
  • MySQL系列(一):索引篇
  • Java聊天
  • 浅聊代理(应用部署)
  • 【JavaEE】生产者消费者模式
  • YAML文件入门
  • 计算机网络体系的形成
  • 【问题思考】泰勒公式证明题如何选展开点?【对称美】
  • idea新建spring boot starter
  • 近期复习三
  • 【7】PyQt布局layout
  • 低多边形建筑3D模型纹理贴图
  • 安装和初始化 VyOS 虚拟机
  • VUE2+THREE.JS 模型上方显示信息框/标签(CSS3DSprite精灵模型)
  • c++遍历算法的transform算法
  • Python-上下文管理器
  • Matlab 在一个文件中调用另一个文件中的函数