顺序表的实现

带泛型的顺序表

package c2_线性表.顺序表的实现;

import java.util.Arrays;

/**
 * @author Wei
 * @create 2021/09/09  15:09
 */

public class SeqList<T> extends Object {

        protected int n;   //顺序表元素个数
        protected Object[] element;   //对象数组存储顺序表的数据元素
        private static int MIN_CAPICITY=16;

        //初始化
        public SeqList(int length) {

            if(length<MIN_CAPICITY) {
                length=MIN_CAPICITY;
            }

            this.element = new Object[length];
            this.n=0; //初始化n

        }

        public SeqList()
        {
            this(MIN_CAPICITY);
        }	//创建默认的空表

        public SeqList(T[] values) {
            this(values.length*2);  //创建两倍values长度的数组

            for(int i=0;i<values.length;i++) {
                if(values[i]!=null) {
                    this.element[this.n++]=values[i];
                }
            }

        } //创建一个两倍长度的数组,此方法可以直接添加新的数组进来


        //插入
        public int insert(int i,T x){

            if(i<0){
                i=0;
            } //数组容错,存放在头数据

            if (i>this.n){ //n为数组长度
                i=this.n;
            } //当插入的位置i大于数组长度时,从末尾插入数据

            Object source[] = element;  //创建一个数组存放原数组

            if(this.n==source.length){
                this.element=new Object[source.length];

                for (int j=0;j<source.length;j++){
                    this.element[j]=source[j];
                } //将原数组元素复制到新的数组中

            }

            for (int j=this.n-1;j>=i;j--){
                this.element[j+1]=source[j];  //复制数组元素,从最后一个位置往后移动直到i
            }

            this.element[i]=x;
            this.n++;
            this.sort();
            return i;

        }

        public int insert(T x){

            return this.insert(this.n,x);

        } //重载方法,从末尾插入数据


        //删除
        public T delete(int i){  //返回第i个元素,0<i<n,返回被删除元素,若i越界,则返回null

            if (i>0 && i<this.n){
                T x =(T)this.element[i];

                for (int j=i;j<this.n-1;j++){
                    this.element[j]=this.element[j+1];
                } //从第i+1个位置开始,元素前移

                this.element[this.n-1]=null;  //数组的最后一个位置为空的 释放实例

                this.n--;  //数组长度-1

                this.sort();
                return x;  //返回被删除对象的引用

            }

            this.sort();
            return null;

        }



        //查找元素
        public int search(T key) {  //若查找到元素则返回元素位置,找不到则返回-1

            for (int i = 0; i < this.n - 1; i++) {

                if (key.equals(this.element[i])) {
                    this.sort();
                    return i;
                }

            }

            this.sort();
            return -1;

        }

        //获取元素
        public T get(int i){ //若i在数组范围内,则返回该位置所在的元素,若数组越界则返回null;

            if (i>=0 && i<this.n-1){
                return (T)this.element[i];
            }

            return null;
        }

        //判空
        public boolean isEmpty(){

            if (this.n==0){
                return true;
            }

            return false;
        }
        //求长度
        public int length(){
            return n;
        }
        //正序遍历
        public  void sort(){
            for (int i=0;i<element.length;i++){
                System.out.print(this.element[i]+" ");
            }
        }

 /* 创建一个顺序表对象,在顺序表对象中存放字符(只有数字字符和英文字符),编写算法删除所有的数字字符。
* 要求:按照下面提示,实现该算法。
* 每找到一个待删点,并不马上删除,而是累计当前待删元素的个数s。
* 于是,对每一个非数字字符,将其前移s个位置。每结点最多移动1次,O(n)。

 */
        public int deleteNumber(T[] elements){
            int count = 0;

            for (int i=0;i<this.n;i++){
                boolean bDeleted = false;

                for (int j=0;i<elements.length;j++){

                    if (elements[j].equals(this.element[i])) {
                        System.out.println(elements[j]);
                        bDeleted = true;
                        count++;
                    }
                }

                if(!bDeleted && count >0){
                    this.element[i-count] = this.element[i];
                }

            }

            this.n -=count;
            return 0;
        }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        SeqList<?> seqList = (SeqList<?>) o;

        if (n != seqList.n) return false;
        // Probably incorrect - comparing Object[] arrays with Arrays.equals
        return Arrays.equals(element, seqList.element);
    }

    @Override
    public int hashCode() {
        int result = n;
        result = 31 * result + Arrays.hashCode(element);
        return result;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值