Java顺序表

19 篇文章 1 订阅

目录

一、线性表

二、顺序表

2.1代码分析

2.1.1 扩容

2.1.2在数组头部插入元素

2.1.3在数组尾部插入元素

2.1.4在数组任意位置插入元素

2.1.5删除指定索引位置的元素

2.1.6删除数组中所有值为value的元素

三、完整代码


一、线性表

线性表:线性表是n个具有相同特性的数据元素的有限序列,常见的线性表有顺序表、链表、栈、队列、字符串......

线性表在逻辑上是线性结构,也就时说是连续的一条直线。但是在物理结构上并不是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

二、顺序表

顺序表:基于数组的线性表,元素不仅逻辑连续,在物理结构上也连续。

动态数组:根据数组的大小动态调整长度。Java中数组的长度是固定的,声明后只能存放固定长度的数值。

2.1代码分析

2.1.1 扩容

当size==data.length时,表示此时数组已满,需要扩容,使用Arrays.copyOf扩容

2.1.2在数组头部插入元素

 

2.1.3在数组尾部插入元素

 

2.1.4在数组任意位置插入元素

2.1.5删除指定索引位置的元素

 

2.1.6删除数组中所有值为value的元素

 

三、完整代码

package seqlist;

import java.util.Arrays;

/**
 * 基于数组的顺序表
 */
public class MyArray {
    // 存储元素仍然还在数组中存储
    private int[] data;
    // 当前动态数组中实际存储的元素个数
    private int size;
    //数组总共能存放的元素个数
    public MyArray(){
        data=new int[10];
    }

    /**
     * 传入数组的大小
     * @param capacity
     */
    public MyArray(int capacity){
        data=new int[capacity];
    }

    /**
     * 在数组头部插入元素
     * @param value 待插入的新元素
     */
    public void addFirst(int value){
        //判断数组是否已满
        if(size==data.length){
            grow();//扩容
        }
        //将第一个位置空出来
        for (int i = size-1; i >=0; i--) {
            data[i+1]=data[i];
        }
        //将待插入元素插入第一个位置
        data[0]=value;
        //数组长度加一
        size++;
    }

    /**
     * 在数组尾部插入元素
     * @param value 待插入的新元素
     */
    public void addLast(int value){
        //判断数组是否已满
        if(size==data.length){
            grow();//扩容
        }
        //将待插入元素插入
        data[size]=value;
        size++;
    }

    /**
     * 在数组任意位置插入元素
     * @param index 传入的索引值
     * @param value 待插入的新元素
     */
    public void addIndex(int index,int value){
        //判断合法性
        if(index<0||index>size){
            System.err.println("false number!");
            return;
        }
        if(size==data.length){
            grow();
        }
        // 将index位置空出来
        for (int i = size-1; i >=index ; i--) {
            data[i+1]=data[i];
        }
        data[index]=value;
        size++;
    }

    /**
     * 判断值为value的元素是否存在
     * @param value
     * @return true or false
     */
    public boolean contains(int value){
        //遍历数组
        for (int i = 0; i < size; i++) {
            if(data[i]==value){
                return true;
            }
        }
        return false;
    }
    /**
     * 根据索引查询元素
     * @param index 索引值
     * @return
     */
    public int get(int index){
        //判断合法性
        if(index<0||index>size-1){
            System.err.println("get index illegal!");
            return -1;
        }
        return data[index];
    }
    /**
     * 在数组中查找value值对应的索引下标
     * @param value
     * @return
     */
    public int getByValue(int value){
        for (int i = 0; i < size; i++) {
            if(data[i]==value){
                return i;
            }
        }
        // 此时循环走完还没找到元素,value不存在
        return -1;
    }
    /**
     * 将指定索引位置元素修改为newValue,返回修改前的元素值
     * @param index
     * @param newValue
     * @return
     */
    public int set(int index,int newValue) {
        //判断合法性
        if(index<0||index>size-1){
            System.err.println("set index illegal!");
            return -1;
        }
        int oldValue=data[index];
        data[index]=newValue;
        return oldValue;
    }
    //头删
    public void removeFirst(){
        removeIndex(0);
    }
    //尾删
    public void removeLast(){
        removeIndex(size-1);
    }
    /**
     * 删除指定索引位置的元素
     * @param index
     */
    public void removeIndex(int index){
        if(index<0||index>size-1){
            System.err.println("remove index illegal!");
            return;
        }
        for (int i = index; i <size-1 ; i++) {
            data[i]=data[i+1];
        }
        size--;
        data[size]=0;
    }

    /**
     * 删除数组中第一个元素值为value的元素
     * @param value
     */
    public void removeValueOnce(int value){
        for (int i = 0; i < size; i++) {
            if(data[i]==value){
                removeIndex(i);
                return;
            }
        }
    }

    /**
     * 删除数组中所有值为value的元素
     * @param value
     */
    public void removeAllValue(int value){
        for (int i = 0; i < size; i++) {
            while(i!=size&&data[i]==value){
                removeIndex(i);
            }
        }
    }
    public String toString(){
        String ret="[";
        for (int i = 0; i <size; i++) {
            ret+=data[i];
            if(i!=size-1){
                ret+=",";
            }
        }
        ret+="]";
        return ret;
    }

    /**
     * 扩容
     */
    public void grow(){
        int[] newData= Arrays.copyOf(this.data,this.data.length<<1);
        this.data=newData;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怎样让大排不硬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值