java之顺序表的创建
顺序表的定义: 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
我们现在要实现的顺序表功能有:增(add)、删(remove)、查(get) 改(set);
由于顺序表底层是数组,所以要创建接口在数组中包含以上功能。
步骤:
1.基本框架构建:
1.1创建一个包,里面包含一个功能接口和数组类。
1.2.在接口中写下要包含的功能。
1.3.在MyArrayList 创建基本属性:
(1).数组和数组中已经包含的元素(UsedSize),同时设置好你这个数组的最大容量(DEFAULT_CAPACITY).
(2).通过构造方法来创建一个新的数组。
2.各种方法具体的实现步骤:
2.1 add(int data )的实现:在usedsize后添加新的元素:
这幅图中,usedSize = 5 则此时我们就在索引为5下添加新元素。
怎么添加?首先要判断这个数组空间是否已满,即比较UsedSize(现有元素)和 数组长度是否已满,满的话,通过Arrays.copyOf来进行扩容,将数组长度变为原来2倍。再将新元素值赋给数组。 否则直接赋值即可。
2.2 add(int pos , int data); 在某个位置处插入新元素。
在插入前,我们需要考虑元素插入的位置是否正确,比如,你不能在-1位置处插入元素(越界),也不能在超过UsedSize位置处插入元素,因为待插入元素前后都应有元素。
此时我们就要自定义一个异常类: PosIllegal 用来检测是否插入位置错误
这个类要继承于RuntimeException
类(是 Java 中一个重要的异常类,属于 java.lang
包,它是所有运行时异常的基类,提供了一种处理那些通常不需要显式捕获或声明的异常的机制)。
之后再创建这个类的构造方法,继承父类。
再回到MyArrayList类中,创建一个检查位置是否正确的类:CheckPos,并在其中指示可能出现的异常。代码示例如下:
private void CheckPos(int pos) throws PosIllegal{ //方法可能会抛出的异常---PosIllegal异常,让调试者处理
if(pos<0||pos>UsedSize)
{
throw new PosIllegal("pos位置不合法"); // 实行抛出异常操作
}
}
同时,也要判断数组是否已满,这里,我们便要用到try–catch来抛出和捕捉异常
具体代码如下:
public void add(int pos, int data) {
try{
//可能会抛出的异常
CheckPos(pos);
if(isFull()){
grow();
}
//功能实现:开始挪动元素
for (int i = UsedSize-1; i >=pos ; i++) {
array[i+1] = array[i];
}
array[pos] = data;
UsedSize++;
}catch(PosIllegal e){
//捕捉异常:
System.out.println("插入元素位置pos不合法");
e.printStackTrace();//printStackTrace 是 Throwable 类中的一个方法,通常用于输出异常的详细信息和堆栈跟踪。
}
}
2.3: public boolean contains(int toFind) 数组中是否包含待查找元素
这里可直接用fori循环将数组内的元素一 一与toFind比较,如果有,返回true,否则false
具体代码如下:
public boolean contains(int toFind) {
for (int i = 0; i < UsedSize; i++) {
if(array[i] == toFind)
{
return true;
}
}
return false;
}
2.4: public int get(int pos) 得到某一个位置的元素。
这里我们不得不考虑一个问题:这个数组是否为空数组。
此时就要实现一个检查数组是否为空的方法: private void CheckEmpty() ,也要创建一个
EmptyException异常类。
同时查找过程中这个元素位置也要有限制,和先前不同,这次Pos可以等于UsedSize(不妨碍元素查找)。具体代码如下:
public class EmptyException extends RuntimeException{
public EmptyException(){
}
public EmptyException(String msg){
super(msg);
}
}
private void checkPos2(int pos) throws PosIllegal{
if(pos<0 || pos>= UsedSize)
{
throw new PosIllegal("pos位置不合法");
}
}
public boolean isEmpty(){
return UsedSize == 0;
}
private void CheckEmpty(){
if(isEmpty())
{
throw new EmptyException("顺序表为空");
}
}
public int get(int pos) {
try{
//抛出异常
CheckEmpty(); //检查数组是否为空
checkPos2(pos); //元素位置是否异常
return array[pos];
}catch (PosIllegal e){
//捕捉异常
e.printStackTrace();
}catch (EmptyException e){
e.printStackTrace();//printStackTrace 是 Throwable 类中的一个方法,通常用于输出异常的详细信息和堆栈跟踪。
}
return -1;
}
2.5 public void set(int pos, int value) //再某个位置设置新的元素。
这里也要考虑数组是否为空以及元素位置是否正确,和2.4类似。代码如下:
@Override
public void set(int pos, int value) {
try
{
CheckEmpty();
checkPos2(pos);
array[pos] = value;
}catch(PosIllegal e){
e.printStackTrace();
}catch (EmptyException e ){
e.printStackTrace();
}
}
2.6:public void remove(int toRemove)消除某个位置的元素:
传入要消除的元素值,再创建 public int indexOf(int toFind) 方法(for循环查找与toRemove相同的元素,返回索引值) 进而得到这个元素的位置。
位置拿到之后,怎么消除?
如图,若要消除pos位置元素,只需将索引3的元素前移覆盖索引2位置,再将索引4移动到索引3的位置即可。 具体代码如下:
@Override
public void remove(int toRemove) {
try{
//抛出异常
CheckEmpty(); //数组不为空
int pos = indexOf(toRemove); //得到待消除元素的位置
if(pos == -1)
{
return;
}
for (int i = pos; i < UsedSize-1; i++) { //?
array[i] = array[i+1]; //覆盖
}
UsedSize--;
}catch (EmptyException e){
//处理/捕捉异常
e.printStackTrace();
}
}
2.7:剩下的简单代码便不再一 一赘述
@Override
public int size() {
return this.UsedSize;
}
@Override
public void clear() {
//清空数组
UsedSize = 0;
}
@Override
public void display() { //展示数组
for (int i = 0; i < UsedSize; i++) {
System.out.println(array[i]+" ");
}
}
}
今天就给大家分享到这里,bb!
喜欢的老铁来个三联吧!
作者:大白鲨哇