【Java】动态数组(顺序表)

news/2024/5/20 9:50:49 标签: Java, 动态增长的数组, 顺序表

Java_0">Java实现一个可动态增长的数组

线性表

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

顺序表

概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数 据的增删查改。
顺序表一般可以分为:

静态顺序表:使用定长数组存储。 动态顺序表:使用动态开辟的数组存储。
静态顺序表适用于确定知道需要存多少数据的场景.

静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用.

接口实现

我们来实现一个动态顺序表. 以下是需要支持的接口.

public class SeqList { // 打印顺序表
	public void display() { }
	// 在 pos 位置新增元素
	public void add(int pos, int data) { }
	// 判定是否包含某个元素
	public boolean contains(int toFind) { return true; } // 查找某个元素对应的位置
	public int search(int toFind) { return -1; }
	// 获取 pos 位置的元素
	public int getPos(int pos) { return -1; }
	// 给 pos 位置的元素设为 value
	public void setPos(int pos, int value) { } //删除第一次出现的关键字key
	public void remove(int toRemove) { }
	// 获取顺序表长度
	public int size() { return 0; }
	// 清空顺序表
	public void clear() { }
}

实现动态数组的源码

public class MyArray {
    int num[];
    int size;

    public MyArray(int length) {
        this.num = new int[length];
    }
    /**
     * 向动态数组中添加元素,默认向数组末尾添加
     * @param data
     */
    public void add(int data) {
        if (size == num.length) {
            num = Arrays.copyOf(num,num.length << 1);
        }
        num[size] = data;
        size ++;
    }

    /**
     * 向动态数组的任意位置插入元素
     * @param index 插入的目标索引
     * @param data
     */
    public void add(int index,int data) {
        // 判断index是否合法
        if (index < 0 || index > size) {
            // 只要index > size 都是非法的,因为数组无法取到数组长度的下标
            System.out.println("索引非法!");
            return;
        }
        // 数组尾插
        if (index == size) {
            add(data);
        }else {// 数组中间位置插入
            // 判断内部数组是否满载
            if (size == num.length) {
                //扩容
                grow();
                //num = Arrays.copyOf(num,num.length << 1);
            }
            // 将index以及之后元素向后搬移
            System.arraycopy(num,index,num,index + 1,size - index);
            num[index] = data;
            size ++;
        }
    }

    //获取数组指定位置的值
    public int get(int index) {
        if(rangeCheck(index)) {
            return num[index];
        }
        return -1;
    }


    //修改数组指定位置的值
    public boolean set(int index,int data) {
        if(rangeCheck(index)) {
            num[index] = data;
            return true;
        }
        return false;
    }

    //删除指定位置的值
    public boolean remove(int data) {
        for (int i = 0; i < size; i++) {
            if(num[i] == data) {
                //将找到的data值的index后的值向前移动,覆盖data值所在位置
                System.arraycopy(num,i+1,num,i,size-i-1);
                num[size] = 0;
                size--;
                return true;
            }
        }
        return false;
    }

    //清空数组
    public void clear() {
        //将数组中的值都赋值为0
        Arrays.fill(num,0,size,0);
    }

    // 返回动态数组长度
    public int size() {
        return size;
    }

    // 打印动态数组内容
    public void print() {
        // 数组永远无法取到数组长度下标,因此不能等于size
        for (int i = 0; i < size; i++) {
            System.out.print(num[i] + "、");
        }
        System.out.println();
    }

    //需要有一个方法来检验index下标的合法性
    //由于该方法只属于MyArray的内部调用,因此将其封装
    private boolean rangeCheck(int index) {
        if(index < 0 || index >= size) {
            return false;
        }
        return true;
    }

    //内部数组的扩容方法
    private void grow() {
        num = Arrays.copyOf(num,num.length << 1);
    }
}

测试代码

package MyArray;

public class Test {
    public static void main(String[] args) {
        MyArray myArray = new MyArray(3);
        //在数组末尾插入元素
        myArray.add(1);
        myArray.add(3);
        myArray.add(5);
        //在数组任意位置插入元素
        myArray.add(3,7);
        myArray.add(4,8);
        //获取数组任意位置的值
        myArray.get(4);
        //修改数组任意位置的值
        myArray.set(3,10);

        myArray.print();
        //删除数组某个指定位置的值
        myArray.remove(3);
        myArray.print();
    }
}

http://www.niftyadmin.cn/n/1280453.html

相关文章

框架设计之菜鸟漫漫江湖路系列 四:江湖学艺(上)

四&#xff1a;江湖学艺&#xff08;上&#xff09;创业帮派项目遇难&#xff0c;引入技术总监人物&#xff0c;力挽狂澜&#xff1b;本人敬之并从其学得武艺本节开始&#xff0c;语言就不复古了&#xff0c;转成大众话的记述文&#xff0c;不然怕是得拖十年才能写完。 话说当年…

前端基础-JavaScript对象(Object)

第9章 对象(Object) 9.1 什么是对象 万物皆对象 现实生活中&#xff1a;万物皆对象&#xff0c;对象是一个具体的事物&#xff0c;一个具体的事物就会有行为和特征。 举例&#xff1a; 一部车&#xff0c;一个手机 车是一类事物&#xff0c;门口停的那辆车才是对象特征&…

C++函数对象

原文&#xff1a;http://blog.csdn.net/ggggqqqqihc/article/details/1727020 标准库里的count_if可以统计容器中满足特定条件的元素的个数。例如要统计一个整数vector——ivec中正数的个数&#xff0c;可以先写一个返回类型为bool&#xff0c;含有一个int参数的条件函数&#…

python打砖块游戏算法设计分析_Python打砖块

在家闲来无事用Python写了一个打砖块游戏&#xff0c;目前完成度一般,先来段视频(声音有点大)演示https://www.zhihu.com/video/1235510400411369472 游戏主要分那么几个板块&#xff1a;小球Ball、挡板Paddle、砖块Brick和主函数 1.Paddle平滑移动 关于游戏如何绘制并且如何刷…

前端基础-JavaScript标准库对象(内置对象)

第10章 标准库对象(内置对象) JavaScript 提供了很多个内置对象&#xff1a;Math/Array/Number/String/Boolean… 对象只是带有属性和方法的特殊数据类型。 我们在学习时其实就是要记住对象的每个属性和方法怎么使用&#xff0c;代表什么含义&#xff1b; 技术问题&#xf…

【Java】—— MAC系统下IDEA中如何进行JDBC连接(MySQL)

最近一直在学习web项目&#xff0c;当然也会涉及与数据库的连接这块&#xff0c;这里就总结一下在IDEA中如何进行MySQL数据库的连接&#xff0c;这里提一下我的电脑是MAC系统&#xff0c;使用的编码软件是IDEA&#xff0c;数据库是MySQL&#xff0c;所以其他系统的小可爱们可能…

调用FileSystemObject.CopyFile发生没有权限的错误

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101最近编写一个JScript&#xff0c;在调用FileSystemObject.CopyFile发生没有权限的错误,具体如下图&#xff1a;开始觉得这个错误挺诡异的&#xff0c;因为我是以管理员身份运行这个js的&#xff0c;怎么会…

前端基础-浏览器API

JS基础-浏览器API 传智播客 & 黑马程序员 第0章 API介绍 HTML&#xff1a;用来存储网页内容; CSS&#xff1a;用来定义这些内容的显示样式&#xff1b; JavaScript&#xff1a;用来创造丰富的页面效果或者网页应用。 0.1 API 介绍 API&#xff08;Application Programming…