顺序表中的那些事儿

不整那些没用的,直接进入主题.

首先我们要搞明白顺序表是由什么来实现的,答案是数组.搞清楚了这个就可以继续下去了.

要实现的方法

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

我们要实现上面的方法之前要创建几个变量.

  1. DEFAULT_SIZE(默认长度)
  2. usedSize(数组的有效长度)
  3. elem(数组)

首先写一下构造方法

public arrayListTwo(){
        this.elem = new int[DEFAULT_SIZE];
    }

在创建arrayListTwo这个类的时候就给elem数组初始化. 接下来登场的是第一个方法.

打印顺序表.

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

非常的简单哈,就是一个简单的for循环,实在不清楚,就讲一讲吧.

变量  i  从0下标开始,到  i  <  usedSize结束,进入一次for循环打印一次,周而复始直到 i >= usedSize为止.

新增元素.

public void add(int data) throws EmptyException {
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
        }
        //要不要判断数组是否为空?在构造方法的时候数组就已经初始化了
//所以不存在数组是空的情况.
//        if(isEmpty()){
//             throw new EmptyException("数组为空");
//        }
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }

在数据结构中,每写一行代码都要十分的谨慎,假如就写最后两行代码就行了,那就少考虑了,当数组满的情况就没有额外的位置来存放元素, 所以要判断数组是否满了,满了就扩容.

到了这里就会有人会问了,数组会不会为null? 答案是不会的,在new 对象的时候,就已经通过构造方法初始化了数组,这样就不会在访问数组元素的时候报错了. 

接下来上强度了,在指定的位置插入元素.

新增元素Pro版

 public void add(int pos, int data) throws InputException{
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
        }
        if(pos < 0 || pos > this.usedSize){
            throw new InputException("输入的位置非法");
        }
        for (int i = this.usedSize - 1; i >= pos; i--) {
            this.elem[i + 1] = this.elem[i];
        }
        this.elem[pos] = data;
        this.usedSize++;
    }

拿到方法不要急着去写代码,先考虑元素能不能放,放哪里的问题,再来写代码.

首先老样子先判断是否满了,满了就扩容.之后就是判断pos位置是否非法.

第二个if中的条件可能有些看不懂哈,这里解释一下. 前面一个条件很好理解,你插入的位置是负数,肯定是不行的, 其次就是后一个条件,  注意注意: 在数据结构中,是不能隔着位置插入的.

因此 pos > usedSize.  pos等于usedSize是可以的.

后面的for循环思路如下动态图.

pos下标的元素空出来了之后就可以将元素插入了.

判断是否包含某个元素

public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(this.elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

这个方法很简单哈,就是一个简单的for循环. 条件核心是usedSize. 

查找某个元素对应的位置

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

这个方法也是简单的一个for循环就搞定了,需要注意的是,当比较的数据是引用型数据时,要用equals来比较.

获取pos位置的元素

public int get(int pos) throws EmptyException, InputException{
        if(isEmpty()){
            throw new EmptyException("数组中没有元素");
        }
        if(pos < 0 || pos >= this.usedSize){
            throw new InputException("pos位置非法");
        }
        return this.elem[pos];
    }

这里需要注意的点就是,第一个if条件判断是否为空,指的是数组中是否有元素,而不是指数组是否为null. pos >= usedSize 条件指的是数组越界.

给pos位置的元素设置为value

public void set(int pos, int value) throws EmptyException, InputException {
        if(isEmpty()){
            throw new EmptyException("数组中没有元素");
        }
        if(pos < 0 || pos >= this.usedSize){
            throw new InputException("pos位置非法");
        }
        this.elem[pos] = value;
    }

这里同理也要判断数组是否为空.因为数组为空的时候没有元素给你修改.同样也要判断pos的位置是否非法.

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

public void remove(int toRemove) throws EmptyException{
        if(isEmpty()){
            throw new EmptyException("数组为空");
        }
        int index = indexOf(toRemove);
        if(index == -1){
            return;
        }
        for(int i = index; i < this.usedSize; i++){
            this.elem[i] = this.elem[i + 1];
        }
        this.usedSize--;
    }

再删除元素的时候要考虑几个问题.

1.数组是否为空,一个空数组,没有元素可以删除.

2.先找到关键字的位置才能进行下一步吧.

for循环同样也有动态图来解释,更直观一点.

结尾

好啦,以上就是全部内容啦, 要是对你有帮助的话,可以给一个免费的赞.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值