手動實現動態數組(java)

  • 數據結構:線性表, 樹, 圖, 集合等;
  • 線性表: 是包含n個相同元素的有限序列;
  • 數組是一種:內存連續的線性表;
  • 動態數組: 動態的擴容與縮容, (縮容沒有實現);
//方法列表:
public int sise();
public boolean isEmpty();
public boolean contains(int element);
public void add(int element);
public void add(int index, int element);
public int get(int index);
public int set(int index, int element);
public int remove(int element);
public void removeOfIndex(int index);
public void printElements()
/**
 * Author: Batac
 * 動態數組:
 * 數組: 是一種連續存儲結構的線性表;
 * 優點: 查詢速度快, 根據地址直接查找到元素(尋址法);
 * 缺點: 插入與刪減元素速度差, 最差需要移動其他所有元素
 */
public class ArrayList {

    //數組
    private int[] elements;

    //元素個數
    private int size;

    //容量
    private static int CAPATICY = 10;
    //沒有找到指定元素
    private static final int ELEMENT_NOT_FOND = -1;


    /**
     * 有參構造方法
     * @param capaticy
     */
    public ArrayList(int capaticy){
        if (capaticy < CAPATICY)capaticy = CAPATICY;
        elements = new int[capaticy];
    }

    /**
     * 無參構造方法
     */
    public ArrayList(){
        this(CAPATICY);
    }

    /**
     * 設置元素個數
     * @return
     */
    public int sise(){
        return this.size;
    }


    /**
     * 判斷元素是否爲空
     * @return
     */
    public boolean isEmpty(){
        if (this.sise() > 0)return false;
        return true;
    }

    /**
     * 判斷元素是否存在
     * @param element
     * @return
     */
    public boolean contains(int element){
        int index = indexOf(element);
        if (index == ELEMENT_NOT_FOND)return false;
        return true;
    }


    /**
     * 添加元素
     * @param element
     */
    public void add(int element){
        add(size,element);
    }

    /**
     * 獲取指定索引出元素
     * @param index
     * @return
     */
    public int get(int index){
        indexOutOfBoundsExceptioni(index);
        return elements[index];
    }

    /**
     * 設置元素到指定位置
     * @param index
     * @param element
     * @return
     */
    public int set(int index, int element){
        indexOutOfBoundsExceptioni(index);
        add(index,element);
        return -1;
    }

    /**
     * 添加元素到指定位置
     * @param index
     * @param element
     */
    public void add(int index, int element){
        changeCapaticy();//擴容或者縮容
        indexOutOfBoundsExceptioni(index);//判斷索引是否越界
        for (int i=size;i>index;i--){
            elements[i] = elements[i-1];
        }
        elements[index] = element;
        size++;
    }



    /**
     * size爲0的時候,直接將所有索引清楚
     */
    public void clear(){
        size = 0;
        //縮容
    }


    /**
     * 刪除元素
     * @param element
     * @return
     */
    public int remove(int element){
        //查找元素所在位置
        int index = indexOf(element);
        if (index  == ELEMENT_NOT_FOND){
            return ELEMENT_NOT_FOND;
        }
        //刪除元素
        removeOfIndex(index);
        return index;
    }

    /**
     * 獲取元素索引
     * @param element
     * @return
     */
    private int indexOf(int element){
        for (int i=0;i<size;i++){
            int ele = elements[i];
            if (ele == element){
                return i;
            }
        }
        return ELEMENT_NOT_FOND;
    }

    /**
     * 擴容獲取縮容
     */
    private void changeCapaticy(){
        if (size+1 == CAPATICY){
            CAPATICY += 10;
            System.out.println("擴容:"+CAPATICY+",size:"+size);
        }else{
            return;
        }
        int[] temps = new int[CAPATICY];
        for (int i=0;i<size;i++){
            temps[i] = elements[i];
        }
        elements = temps;
    }


    /**
     * 判斷索引是否合法 -> 內部使用
     * @param index
     */
    private void indexOutOfBoundsExceptioni(int index){
        if (index < 0 || index > size){
            throw new IndexOutOfBoundsException("index:"+index+",Size:"+size);
        }
    }


    /**
     * 刪除指定索引的元素
     * @param index
     */
    public void removeOfIndex(int index){
        indexOutOfBoundsExceptioni(index);
        for (int i=index;i<size;i++){
            elements[i] = elements[i+1];
        }
        size--;
    }


    /**
     * 打印內容
     */
    public void printElements(){
        String str = "[";
        for (int i=0;i<size;i++){
//            System.out.println(elements[i]+"");
            if (i == size-1){
                str += elements[i]+"";
            }else{
                str = str+elements[i]+",";
            }
        }
        str += "]";
        System.out.println(str);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章