Java顺序表的实现

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。在Java中也有类似这样的顺序表集合类 – ArrayList
接下来将创建MyArrayList对Java顺序表的一些常用方法进行实现。

1.构造方法初始化数组

首先创建MyArrayList类,再在其中定义一个数组存储数据,一个成员变量用来记录有效数据的大小,一个常量用于初始化数组容量。

public class MyArraysList {

    public int [] nums;
    //记录有效数据
    public int usedSize;
    private final int DEFAULT_SIZE = 10;

    //构造方法创建数组
    public MyArraysList() {
        this.nums = new int[DEFAULT_SIZE];
    }
}

2.实现add方法,新增元素

直接在数组后加入元素

直接把值加进数组即可,这时我们注意到,在增加元素时,很容易产生数组溢出的情况,需要提前判断是否溢出,若溢出要对数组进行扩容再把元素加进数组中。

    public void add(int num) {
        if(isFull()) {
            raise();
        }

        //注意这里usedSize也要用用this不然不知道是谁的引用的大小
        this.nums[this.usedSize] = num;
        this.usedSize += 1;
    }
    
    //扩容,这里进行两倍扩容
    private void raise() {
        this.nums =Arrays.copyOf(this.nums,2*this.nums.length);
    }

    //判断usedSize是否超过使用额度
    private boolean isFull() {
        return this.usedSize == nums.length;
    }
在pos位置加入元素

在指定位置加入元素时,要考虑该位置是否可以加入元素,创建一个新的类自定义一个异常,若该位置不在数组长度范围内则抛出该异常

public class outOfIndex extends Exception{
    public outOfIndex(String mis) {
        super(mis);
        System.out.println(mis);
    }
}
    //判断位置合法性
    private void checkLegal(int pos) throws outOfIndex {
        if(pos > this.usedSize || pos < 0) {
            throw new outOfIndex("该位置不合法!");
        }
    }
    //在pos位置加入元素
    public void add(int pos, int val) {
        //处理异常
        try {
            checkLegal(pos);
        }catch (outOfIndex o) {
        
        }
        if(isFull()) {
            raise();
        }
        for (int i = this.usedSize; i > pos; i--) {
            this.nums[i] = this.nums[i-1];
        }
        
        this.nums[pos] = val;
        usedSize++;
    }

3.打印顺序表

直接遍历数组一遍,需要注意实际数据长度为usedSize,所以只需要遍历到usedSize长度即可。

   public void print() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.nums[i] + " ");
        }
        System.out.println( );
    }

4.实现contain方法:判断某元素是否在数组中

遍历数组一遍,查找该元素

   public boolean contain(int num) {
        //遍历数组查询 时间复杂度O(n)
        for (int i = 0; i < this.usedSize; i++) {
            if(num == this.nums[i]) {
                return true;
            }
        }
        return false;
    }

5.实现index方法:查找某个元素第一次出现的位置

遍历数组查找,返回下标,若未包含该元素则返回-1

    public int index(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(toFind == this.nums[i]) {
                return i;
            }
        }
        return -1;
    }

6. 实现remove方法:删除第一次出现的关键字key

先调用本身的index方法找到要删除的元素的位置,从该位置开始,用后面的值覆盖前面的值,最后usedSize减1,若index返回-1,则顺序表内没有要删除的元素。

    public void remove(int key) {
        int pos = index(key);
        if(pos == -1) {
            System.out.println("无该元素!");
            return;
        }
        for(int i = pos; i < this.usedSize; i++) {
            this.nums[i] = this.nums[i+1];
        }
        this.usedSize--;
    }

7. 实现size方法:获取顺序表长度

顺序表的长度也就是usedSize的值

    public int size() {
        return this.usedSize;
    }

8.实现clear方法:清空顺序表

直接令usedSize为空即可

    public void clear() {
        this.usedSize = 0;
    }
顺序表和链表是两种基本的数据结构,它们在Java中可以分别通过数组和链式节点来实现顺序表通常使用数组来实现,因为它提供了连续的内存空间,可以通过下标直接访问元素,实现O(1)时间复杂度的查找操作。顺序表的插入和删除操作时间复杂度为O(n),因为这可能涉及到移动大量元素来填补因删除元素或插入新元素而在数组中产生的空位或额外空间。 链表使用一系列的节点来存储数据,每个节点都包含数据以及指向下一个节点的引用(在双向链表中,还有指向前一个节点的引用)。链表的插入和删除操作通常只需要改变相应的指针,因此在理想情况下时间复杂度为O(1),而查找操作需要从头节点开始,遍历链表,直到找到目标节点,所以时间复杂度为O(n)。 以下是使用Java实现顺序表和链表的简单示例: 顺序表(数组实现): ```java public class ArrayList<T> { private T[] data; private int size; public ArrayList(int capacity) { data = (T[]) new Object[capacity]; size = 0; } public void add(T element) { if (size >= data.length) { resize(); } data[size++] = element; } // 其他方法,如get(index), remove(index)等 private void resize() { // 实现扩容逻辑 } } ``` 链表(单向链表实现): ```java public class LinkedList<T> { private Node<T> head; private Node<T> tail; private int size; private static class Node<T> { T data; Node<T> next; public Node(T data, Node<T> next) { this.data = data; this.next = next; } } public LinkedList() { head = null; tail = null; size = 0; } public void add(T element) { Node<T> newNode = new Node<>(element, null); if (head == null) { head = newNode; tail = newNode; } else { tail.next = newNode; tail = newNode; } size++; } // 其他方法,如get(index), remove(index)等 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值