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

news/2024/11/19 9:41:18/

文章目录

  • 前言
  • 顺序表
  • 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.ppmy.cn/news/1260441.html

相关文章

编织魔法世界——计算机科学的奇幻之旅

文章目录 每日一句正能量前言为什么当初选择计算机行业计算机对自己人生道路的影响后记 每日一句正能量 人生就像赛跑&#xff0c;不在乎你是否第一个到达尽头&#xff0c;而在乎你有没有跑完全程。 前言 计算机是一个神奇的领域&#xff0c;它可以让人们创造出炫酷的虚拟世界…

Linux-网络服务和端口

域名&#xff1a;便于人们记忆和使用的标识符 www.baidu.com域名解析&#xff1a;将域名转换为与之对应的 IP 地址的过程 nameserver 8.8.8.8ip地址&#xff1a;网络设备的唯一数字标识符 域名ip地址localhost127.0.0.1 网络服务和端口 网络服务端口ftp21ssh22http80https…

ERP和MES的区别与联系,这篇接地气的文章终于讲明白了!

一、ERP和MES之间的“区别” ERP和MES系统在企业管理中都扮演着重要的角色&#xff0c;但它们的功能和职责各有不同。 既然今天要聊ERP和MES的区别&#xff0c;那肯定要给大家讲明白了才行。 所以&#xff0c;这里首先得从工厂的业务模式说起。 作为一个工厂&#xff0c;存…

深入理解mysql的explain命令

1 基础 全网最全 | MySQL EXPLAIN 完全解读 1.1 MySQL中EXPLAIN命令提供的字段包括&#xff1a; id&#xff1a;查询的标识符。select_type&#xff1a;查询的类型&#xff08;如SIMPLE, PRIMARY, SUBQUERY等&#xff09;。table&#xff1a;查询的是哪个表。partitions&…

很全面 影响无人机自动返航的因素总结

在无人机技术不断成熟的今天&#xff0c;自主返航技术成为保障飞行安全的一种重要工具。无人机在多种情况下能够智能判断&#xff0c;主动实施返航动作&#xff0c;为用户提供更加可靠的飞行保障。以下是一些常见的无人机自动返航场景&#xff0c;让我们深入了解这项技术背后的…

vue中的动画组件使用及如何在vue中使用animate.css

“< Transition >” 是一个内置组件&#xff0c;这意味着它在任意别的组件中都可以被使用&#xff0c;无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发&#xff1a; 由 v-if 所触发的切换由 v-show 所触…

掌握Selenium4:详解各种定位方式

Selenium4中有多种元素定位方式&#xff0c;主要包括以下几种&#xff1a; 通过ID属性定位&#xff1a;根据元素的id属性进行定位。通过name属性定位&#xff1a;当元素没有id属性而有name属性时&#xff0c;可以使用name属性进行元素定位。通过class name定位&#xff1a;可以…

短剧分销系统开发:短剧分销推广

近两年内&#xff0c;随着短剧的发展&#xff0c;节奏快、剧情紧凑的短剧逐渐成为了大众的“新宠”。短剧行业也凭着成本低、投资低、周期短的优势成为了众多创业者的首要选择&#xff0c;越来越多的专业团队加入到短剧的赛道中。 根据数据显示&#xff0c;我国短剧市场规模有…