数组队列基本功能实现

数组队列基本功能的实现

一、概述

数组队列的本质就是一个数组,其基本功能就是初始化、增、删、查、改等。用如下的接口来进行方法抽象,规定基本功能。

public interface MyList<E>{
    /**
     *
     * @return 存储的元素个数
     */
    int size();

    /**
     * @param value 添加的元素 
     */
    void add(E value);

    /**
     * 合并
     * @param list 需要合并的List
     */
    void addAll(MyList list);

    /**
     * 合并一个对象数组
     * @param objects
     */
    void addAll(E[] objects);
    /**
     * 获取:
     * @param index 根据下标获取
     * @return 返回元素对象
     */
    Object get(int index);

    /**
     * 根据元素查找 
     * @param value
     * @return 下标数组
     */
    int[] get(E value);

    /**
     * 根据下标删除
     * @param index
     */
    void remove(int index);

    /**
     * 根据元素对象值删除
     * @param value
     */
    void remove(E value);

    /**
     * 清空队列 
     */
    void removeAll();


    /**
     *
     * @param index 目标元素的下标
     * @param value 目标元素需要替换的对象
     */
    void set(int index,E value);

    /**
     *
     * @param repobj 目标元素对象
     * @param value 目标元素需要替换的对象
     */
    void set(E repobj,E value);


    /**
     * 排序 对象的 hashcode 
     */
    void sort();




}

二、实现

  1. 类中的元素以及初始化如下,主要表示队列的长度及元素。
   public int size;
   public int length;
   public Object[] value;
   public final int MAX_length=Integer.MAX_VALUE;
   public final int MIN_length=10;

   public MyArraylist(int l){
       size=0;
       if(l<MIN_length)
           l=MIN_length;
       value=new Object[l];
       length=l;
   }
  1. size()很简单,只要返回size即可。
public int size() {
        return this.size;
    }

3.三种add也不复杂,主要部分就是修改size、length和value。

	@Override
	public void add(E value) {
        if(this.size==length){
            int newlength=(length>>1)+length;
            Object[] newvalue=new Object[newlength];
            for(int i=0;i<length;i++){
                newvalue[i]=this.value[i];
            }
            length=newlength;
            this.value=newvalue;
            size++;
        }
        else {
            size++;
            this.value[size-1]=value;
        }
    }

    @Override
    public void addAll(MyList list) {
        if((this.size+list.size())>length){
            int templ=this.size+list.size();
            int newlength=(templ>>1)+templ;
            Object[] newvalue=new Object[newlength];
            for(int i=0;i<this.size;i++){
                newvalue[i]=this.value[i];
            }
            for(int i=0;i<list.size();i++){
                newvalue[this.size+i]=list.get(i);
            }
            length=newlength;
            this.value=newvalue;
            this.size+=templ;
        }
        else {
            this.size+=list.size();
            for(int i=0;i<list.size();i++){
                value[this.size+i]=list.get(i);
            }
        }

    }

    @Override
    public void addAll(E[] objects) {
        if((this.size+objects.length)>length){
            int templ=this.size+objects.length;
            int newlength=(templ>>1)+templ;
            Object[] newvalue=new Object[newlength];
            for(int i=0;i<this.size;i++){
                newvalue[i]=this.value[i];
            }
            for(int i=0;i<objects.length;i++){
                newvalue[this.size+i]=objects[i];
            }
            length=newlength;
            this.value=newvalue;
            this.size+=templ;
        }
        else {
            this.size+=objects.length;
            for(int i=0;i<objects.length;i++){
                value[this.size+i]=objects[i];
            }
        }
    }

  1. 获取元素时要注意下镖是否发生越界。
@Override
    public Object get(int index) {
        if(index<0||index>=length)
            return null;
        else{
            return value[index];
        }
    }

    @Override
    public int[] get(E value) {
        int judge=0;
        int[] ans=new int[size];
        for(int i=0;i<size;i++){
            if(this.value[i]==value){
                ans[judge]=i;
                judge++;
            }
        }
        int[] ans2=new int[judge];
        for(int i=0;i<judge;i++){
            ans2[i]=ans[i];
        }
        return ans2;
    }
  1. 删除元素也要注意目标是否有越界,以及删除最后一个元素的特殊情况。
public void remove(E value) {
        int temp=size;
        for(int i=0;i<temp;i++){
            if(this.value[i]==value){
                remove(i);
                size--;
            }
        }
    }

    @Override
    public void removeAll() {
        size=0;
        Object[] newvalue=new Object[length];
        value=newvalue;
    }
  1. 修改元素也要注意目标是否有越界。
@Override
    public void set(int index, E value) {
        if(index<0||index>=size)
            return;
        else{
            this.value[index]=value;
        }
    }

    @Override
    public void set(E repobj, E value) {
        for(int i=0;i<size;i++){
            if(this.value[i]==repobj)
                this.value[i]=value;
        }
    }
  1. 队列的排序是根据队列元素的hashcode()值来进行的,用一个HashMap记录hashcode()与位置的映射。
@Override
    public void sort() {
        int[]hash=new int[size];
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i=0;i<size;i++){
            map.put(value[i].hashCode(),i);
            hash[i]=value[i].hashCode();
        }
        Arrays.sort(hash);
        Object[] newvalue=new Object[length];
        for(int i=0;i<size;i++){
            newvalue[i]=value[map.get(hash[i])];
        }
        value=newvalue;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值