数据结构(Java版)第五期:ArrayList与顺序表(下)

目录

一、数组实现顺序表

在探讨顺序表的实现时,我们通常会想到数组这一基础数据结构。本文将通过一个简单的例子,展示如何使用数组来构建一个顺序表,并实现其基本操作。

public class MyArrayList {
    private int[] arr;
    private int size; // 记录有效元素的数量

    // 构造函数,初始化数组容量
    public MyArrayList(int capacity) {
        arr = new int[capacity];
    }
}

在上述代码中,我们定义了一个名为MyArrayList的类,它使用一个整型数组arr来存储元素,并用一个size变量来追踪当前有效元素的数量。

接下来,我们将实现一系列方法,以支持顺序表的基本操作,包括增加、删除、查找和修改元素。

// 返回顺序表中元素的数量
public int size() {
    return size;
}

// 在顺序表末尾添加一个新元素
public void add(int val) {
    if (size == arr.length) {
        resize();
    }
    arr[size++] = val;
}

// 在指定位置插入一个新元素
public void add(int index, int val) {
    if (index < 0 || index > size) {
        throw new IndexOutOfBoundsException("Index out of bounds");
    }
    if (size == arr.length) {
        resize();
    }
    for (int i = size; i > index; i--) {
        arr[i] = arr[i - 1];
    }
    arr[index] = val;
    size++;
}

// 根据下标获取元素
public int get(int index) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException("Index out of bounds");
    }
    return arr[index];
}

// 根据下标设置元素
public void set(int index, int val) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException("Index out of bounds");
    }
    arr[index] = val;
}

// 删除指定值的第一个元素
public void delete(int val) {
    int index = indexOf(val);
    if (index != -1) {
        remove(index);
    }
}

// 根据下标删除元素
public void remove(int index) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException("Index out of bounds");
    }
    for (int i = index; i < size - 1; i++) {
        arr[i] = arr[i + 1];
    }
    size--;
}

// 检查元素是否存在于顺序表中
public boolean contains(int val) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == val) {
            return true;
        }
    }
    return false;
}

// 查找元素的索引
public int indexOf(int val) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == val) {
            return i;
        }
    }
    return -1;
}

// 清空顺序表
public void clear() {
    size = 0;
}

// 将顺序表转换为字符串形式,便于打印
@Override
public String toString() {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("[");
    for (int i = 0; i < size; i++) {
        stringBuilder.append(arr[i]);
        if (i < size - 1) {
            stringBuilder.append(", ");
        }
    }
    stringBuilder.append("]");
    return stringBuilder.toString();
}

// 私有方法,用于扩容
private void resize() {
    int[] newArr = new int[(int) (arr.length * 1.5)];
    for (int i = 0; i < size; i++) {
        newArr[i] = arr[i];
    }
    arr = newArr;
}

现在,我们已经实现了一个基本的顺序表类MyArrayList,它包含了添加、删除、查找和修改元素的方法。接下来,我们将通过一个简单的测试来验证我们的实现。

public static void test() {
    MyArrayList list = new MyArrayList(10);
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    System.out.println("Size: " + list.size());
    System.out.println("List: " + list);
}

public static void main(String[] args) {
    test();
}

通过上述测试代码,我们可以验证MyArrayList类的功能是否符合预期。这个简单的实现展示了如何使用数组来构建一个顺序表,并提供了基本的操作接口。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4679.html

(0)
LomuLomu
上一篇 2024 年 12 月 28 日 上午10:57
下一篇 2024 年 12 月 28 日

相关推荐

  • 【Java 学习】Java抽象类详解:从理论到实践,带你迈向面向对象的深度思考!

    💬 欢迎讨论:如对文章内容有疑问或见解,欢迎在评论区留言,我需要您的帮助! 👍 点赞、收藏与分享:如果这篇文章对您有所帮助,请不吝点赞、收藏或分享,谢谢您的支持! 🚀 传播技术之美:期待您将这篇文章推荐给更多对需要学习Java语言、低代码开发感兴趣的朋友,让我们共同学习、成长! 1. 什么是抽象类? 举一个Animal类、Cat类和Dog类的例子: “`j…

    2025 年 1 月 15 日
    16200
  • Java Druid 面试题

    Druid连接池在项目中有哪些优势? 性能优越:Druid采用了高效的连接管理机制,可以快速地创建和回收数据库连接,减少了连接的创建和销毁带来的性能开销。 监控与统计:Druid提供了详细的监控信息,包括连接池的状态、SQL执行的统计信息等,这有助于性能调优和问题诊断。 SQL日志记录:Druid内置了SQL执行日志记录功能,可以记录所有SQL语句的执行情况…

    未分类 2025 年 1 月 11 日
    17900
  • Microi 吾码与 JavaScript:前端低代码平台的强大组合

    目录 一、引言 二、Microi 吾码概述 三、JavaScript 在 Microi 吾码前端开发中的应用 (一)前端 V8 引擎与 JavaScript (二)接口引擎与 JavaScript 四、JavaScript 在 Microi 吾码后端开发中的协同 (一)与 C# 后端框架的交互 (二)利用 gRPC 实现跨语言通信 五、Microi 吾码中 …

    2025 年 1 月 1 日
    15800
  • volatile关键字

    在Java中,使用volatile关键字修饰一个变量可以带来以下效果: 可见性 :volatile保证了变量的可见性,即当一个线程修改了volatile变量的值时,新值对于其他线程来说是立即可见的。这意味着,如果一个线程更新了volatile变量,其他线程在访问这个变量时,总是能看到最新的值。 禁止指令重排 :volatile变量的写操作对于后续的读操作是先…

    未分类 2025 年 1 月 6 日
    11200
  • 『玩转Streamlit』–集成定时任务

    学习了Streamlit了之后,可以尝试给自己的命令行小工具加一个简单的界面。 本篇总结了我改造自己的数据采集的工具时的一些经验。 1. 概要 与常规的程序相比,数据采集任务的特点很明显,比如它一般都是I/O密集型程序,涉及大量网络请求或文件读写,耗费的时间比较长;而且往往是按照一定的时间间隔周期性地执行。 这样的程序对交互性要求不高,所以我之前都是用命令行…

    2025 年 1 月 16 日
    22700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信