首页 > 其他分享 >ArrayList顺序表简单实现

ArrayList顺序表简单实现

时间:2024-06-13 10:33:22浏览次数:12  
标签:顺序 int ArrayList pos usesize void 数组 简单 public

一、创建MyArrayList框架 

1.1 MyArrayList 类中实现 arr 数组

import java.util.Arrays;

public class MyArrayList {

    private int[] arr;
    private int usesize;

    private static final int P = 10;

    public MyArrayList() {
        arr = new int[P];
    }

在 MyArrayList 类内创建 arr 数组,usesize 是 arr 数组内元素个数,定义常量 P 为10,并通过构造器将 arr 数组的初始内存赋值为10

1.2 实现 IList 接口

public interface IList {

    // 在数组末尾新增元素
    public void add(int data);
    // 判断数组是否已满
    boolean isFull();
    // 在 pos 位置新增元素
    public void add(int pos, int data);
    // 判定是否包含某个元素
    public boolean contains(int toFind);
    // 查找某个元素对应的位置
    public int indexOf(int toFind);
    // 获取 pos 位置的元素
    public int get(int pos);
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public void remove(int toRemove);
    // 获取顺序表长度
    public int size() ;
    // 清空顺序表
    public void clear();
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() ;
}

该接口内有各种抽象类方法, MyArrayList 类 implements IList 接口后需要重写接口内的所有抽象类方法

1.3  MyArrayList 类 implements IList 接口

import java.util.Arrays;

public class MyArrayList implements IList{

    private int[] arr;
    private int usesize;

    private static final int P = 10;

    public MyArrayList() {
        arr = new int[P];
    }

    @Override
    public void add(int data) {
        
    }

    @Override
    public boolean isFull() {
        return false;
    }

    @Override
    public void add(int pos, int data) {

    }

    @Override
    public boolean contains(int toFind) {
        return false;
    }

    @Override
    public int indexOf(int toFind) {
        return 0;
    }

    @Override
    public int get(int pos) {
        return 0;
    }

    @Override
    public void set(int pos, int value) {

    }

    @Override
    public void remove(int toRemove) {

    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public void clear() {

    }

    @Override
    public void display() {

    }
}

 

二、重写各种方法

// 在数组末尾新增元素
public void add(int data);
// 判断数组是否已满
boolean isFull();
// 在 pos 位置新增元素
public void add(int pos, int data);
// 判定是否包含某个元素
public boolean contains(int toFind);
// 查找某个元素对应的位置
public int indexOf(int toFind);
// 获取 pos 位置的元素
public int get(int pos);
// 给 pos 位置的元素设为 value
public void set(int pos, int value);
//删除第一次出现的关键字key
public void remove(int toRemove);
// 获取顺序表长度
public int size() ;
// 清空顺序表
public void clear();
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display() ;

2.1 重写两种 add 方法

在数组末尾新增元素

2.1.1 第一种:
@Override
public void add(int data) {
    if(isFull()) {        // 在添加元素前使用 isFull 方法需判断数组是否存满
        grow();           // 如果已满,使用 grow 方法扩大数组
    }
    arr[usesize] = data;
    usesize++;

}
2.1.1.1  isFull 方法

判断数组是否已满

@Override
public boolean isFull() {    // 判满,返回 usesize 与 数组长度 的比较结果
    return usesize == this.arr.length;  
}
2.1.1.2  grow 方法
private void grow() {      // 使用 Arrays.copyOf 方法将数组的长度扩大为原来的两倍
    arr = Arrays.copyOf(arr, 2 * arr.length);  
}

 

 2.1.2 第二种:

在 pos 位置新增元素

@Override
public void add(int pos, int data) {

    try{                    // 使用 try...catch() 处理异常 
        check2(pos);        // 使用 check2 方法判断 pos 位置是否合法,并抛出异常
        if(isFull()) {      // 在添加元素前使用 isFull 方法需判断数组是否存满
            grow();         // 如果已满,使用 grow 方法扩大数组    
        }
        for (int i = usesize - 1; i >= pos ; i--) {
            arr[i + 1] = arr[i];
        }
        arr[pos] = data;
        usesize++;
    } catch (PosException e) {        // 捕捉异常,打印异常信息
        System.out.println("插入位置有误");
        e.printStackTrace();
    }

}
2.1.2.1 check2 方法: 
private void check2(int pos) throws PosException{
    if(pos < 0 || pos > usesize ) {      // check 方法中的 pos 不允许 = usesize    
        throw new PosException("输入位置有误"); // 如果 pos不合法,抛出PosException
    }
}
2.1.2.2 PosException 类:
public class PosException extends RuntimeException{  // 自定义 PosException 异常
    public PosException() {
        super();
    }

    public PosException(String message) {
        super(message);
    }
}

 2.2 重写 contains 方法

判定是否包含某个元素

遍历 arr 数组,如果数组有与toFind相同的元素则返回 true ,否则返回 false

@Override
public boolean contains(int toFind) {

    for (int i = 0; i < usesize; i++) {   // 遍历数组
        if(toFind == arr[i]) {            // 判断数组中是否有与 toFind 相同的元素   
            return true;                  // 如果有,返回true
        }
    }
    return false;                         // 遍历完数组后,没有与 toFind 相同的元素
}                                         // 返回 false                       

2.3 重写 indexOf 方法

查找某个元素对应的位置

遍历数组,如果数组中存在与 toFind 相同的元素则返回数组下标,否则返回 -1

@Override
public int indexOf(int toFind) {
    for (int i = 0; i < usesize; i++) { // 遍历数组
        if(toFind == arr[i]) {          // 判断数组中是否有与 toFind 相同的元素     
            return i;                   // 如果有,返回该元素下标
        }
    }
    return -1;                        // 遍历完数组后,没有与 toFind 相同的元素      
}                                     // 返回 -1          

2.4 重写 get 方法

获取 pos 位置的元素 

@Override
public int get(int pos) {
    try{                  // 使用 try...catch() 处理异常       
        empty();          // 判断数组是否为空,为空则抛出异常EmptyException
        check(pos);       // 使用 check 方法判断 pos 位置是否合法,并抛出异常 
        return arr[pos];  // 返回 pos 位置的元素      

    } catch (PosException e) {      // 捕捉异常,打印异常信息
        e.printStackTrace();
    } catch (EmptyException e) {    // 捕捉异常,打印异常信息    
        e.printStackTrace();
    }
    return -1;
}
 2.4.1 empty 方法
private void empty() throws EmptyException{   // 判断 usesize 是否为零,为零抛出异常
    if(usesize == 0) {                           EmptyException              
        throw new EmptyException("数组为空");    
    }
2.4.2  check 方法
private void check(int pos) throws PosException{ 
    if(pos < 0 || pos >= usesize ) {       // check 方法中的 pos 允许 = usesize    
        throw new PosException("输入位置有误");// 如果 pos不合法,抛出PosException
    }
}
2.4.3  EmptyException 类
public class EmptyException extends RuntimeException{ // 自定义 EmptyException 异常

    public EmptyException() {
        super();
    }

    public EmptyException(String message) {
        super(message);
    }
}

 

2.5 重写 set 方法

给 pos 位置的元素设为 value 

@Override
public void set(int pos, int value) {
    try{
        empty();          // 判断数组是否为空,为空则抛出异常EmptyException
        check(pos);       // 使用 check 方法判断 pos 位置是否合法,并抛出异常 
        arr[pos] = value; // 将 pos 位置的值赋值为 value

    } catch (PosException e) {     // 捕捉异常,打印异常信息
        e.printStackTrace();
    } catch (EmptyException e) {   // 捕捉异常,打印异常信息     
        e.printStackTrace();
    }
}

2.6 重写 remove 方法

删除第一次出现的关键字key

@Override
public void remove(int toRemove) {
    try{
        empty();      // 判断数组是否为空,为空则抛出异常EmptyException   
        int p = indexOf(toRemove);  // 使用 indexOf 方法获取要删除元素的下标位置
        if(p == -1) {         // 返回 -1 则数组中没有要删除的元素并结束
            return;
        }
        for (int j = p; j < usesize - 1; j++) {  // 从要删除元素下标开始遍历数组
            arr[j] = arr[j + 1];     // 将数组中后一个元素赋值给前一个元素
            usesize--;  // usesize 减一
        }
    } catch (EmptyException e) {  // 捕捉异常,打印异常信息
        e.printStackTrace();
    }
}

 2.7 重写 size 方法

获取顺序表长度

@Override
public int size() {
    return usesize;  // 返回 usesize
}

2.8 重写 clear 方法

清空顺序表 

@Override
public void clear() {
    usesize = 0;  // 将 usesize 赋值为零
}

2.9 重写 display 方法

打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的

@Override
public void display() {
    for (int i = 0; i < usesize; i++) {  // 遍历数组并打印数组信息
        System.out.print(arr[i] + " ");  
    }
}

三、总结 

顺序表是通过一段连续的存储单元来存储数据元素的,这种存储方式使得元素在物理位置上是相邻的,从而可以通过下标直接访问任意位置的元素。这种特性使得顺序表在访问元素时具有非常高的效率。顺序表的基本操作包括插入、删除、查找和修改等,通过不断练习和实践,我逐渐掌握了这些操作的实现技巧。顺序表的性能与其存储方式和操作实现密切相关。

我深入了解了顺序表的时间复杂度和空间复杂度分析方法。这有助于我在实际编程中根据需求选择合适的数据结构和算法,以达到最优的性能。学习顺序表不仅是为了理解其基本概念和特性,更重要的是将其应用于实际编程中。

我尝试使用顺序表解决了一些实际问题,如实现一个简单的通讯录管理系统、统计一个文本文件中不同单词的出现次数等。这些实践经历让我更加深入地理解了顺序表的实际应用和价值。

标签:顺序,int,ArrayList,pos,usesize,void,数组,简单,public
From: https://blog.csdn.net/Pritar/article/details/139484301

相关文章

  • web前端网页制作课作业:网页设计期末作业 使用HTML CSS技术制作中华传统文化网站【文房
    ......
  • HTTP1.x HTTP2 HTTP3 的简单对比
    协议简要描述比喻HTTP1.0短连接,一次数据通信,结束后就断开一次性道路,简单暴力通过。HTTP1.1长连接,连接可以被复用,但需要按照资源顺序复用。单向单车道,婚礼车队,不能逆序。HTTP2连接复用,增加了http头部压缩和帧传输,连接可以被异步服用,服务器端可以主动推送资源......
  • 【数据结构】【版本1.0】【线性时代】——顺序表
    快乐的流畅:个人主页个人专栏:《算法神殿》《数据结构世界》《进击的C++》远方有一堆篝火,在为久候之人燃烧!文章目录引言一、顺序表的概念1.1最基础的数据结构:数组1.2数组与顺序表的区别二、静态顺序表三、动态顺序表的模拟实现3.1定义3.2初始化3.3......
  • 【设计模式】创建型设计模式之工厂模式(简单工厂、工厂方法、抽象工厂、go简单实例)
    一般情况下,工厂模式分为三种更为细分的类型:简单工厂、工厂方法和抽象工厂。其中,前两者的方法原理比较简单,在实际的项目里也比较常用;而抽象工厂的原理稍微复杂,在实际的项目中相对也不常用。所以,我们今天重点是前两种工厂模式,简单工厂在下面这段代码里,我们根据配置文件的后......
  • 【java问答小知识8】一些Java基础的知识,用于想学习Java的小伙伴们建立一些简单的认知
    Java中的"java.util.IdentityHashMap"如何比较键?回答:"java.util.IdentityHashMap"使用==操作符来比较键,即它比较的是引用身份。Java中的"java.util.EventListener"接口有什么作用?回答:"java.util.EventListener"接口是所有事件监听器接口的基接口,用于定义事件处理方法......
  • springboot rabbitmq如何保证消息顺序消费
    很多时候,消息的消费是不用保证顺序的,比如借助mq实现订单超时的处理。但有些时候,业务中可能会存在多个消息需要顺序处理的情况,比如生成订单和扣减库存消息,那肯定是先执行生成订单的操作,再执行扣减库存的操作。那么这种情况下,是如何保证消息顺序消费的呢?首先,为了效率,我们可以设置......
  • 怎么监控屏幕?这三种方法,简单好用!
    屏幕监控已成为保障数据安全和提高工作效率的重要工具。无论你是企业管理者,还是个人用户,掌握屏幕监控的方法都能为你带来诸多便利。点击获取软件https://work.weixin.qq.com/ca/cawcde06a33907e60a接下来,就让我们一起了解三种简单好用的屏幕监控方法吧!方法一:外接显示器特......
  • 电脑防止拷贝怎么设置?操作简单,拿走不谢!
    在这个信息爆炸的时代,电脑中的数据安全显得尤为重要。是否担心自己的重要文件、设计稿、商业机密被轻易拷贝泄露?点击获取软件https://work.weixin.qq.com/ca/cawcde06a33907e60a今天,就为大家带来4个简单实用的方法,帮助你轻松设置电脑,防止数据被非法拷贝!方法一:使用加密软件......
  • c#编写一个简单的http服务器
    C#代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Net;usingSystem.IO;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){usin......
  • 图片和视频都可以去水印啦,ai去水印的简单两种方法
    有时候我们希望移除视频中的水印,但又不擅长使用专业软件,结果反而花费了很多时间和精力。这种情况下该怎么办呢?今天给大家推荐两个方法:一.在线去水印Photopea是一款在线图像编辑器,界面和功能与Photoshop相似,无需下载软件即可使用。其强大的AI去水印功能使得去除图片水印变得非常......