數據結構(java版) 之二次封裝屬於我們自己的數組

github 地址:https://github.com/heng1234/data-structure

 

Array類 

package com.company.Array;




/**
 * Array
 * 自定義數組
 * @author heng
 * @date 2019/9/24
 **/
public class Array<E> {

    /**
     * 存儲的data
     */
    private  E[] data;

    /**
     * 描述data中有效的數量
     */
    private int size;

    /**
     * 無參構造
     */
    public Array(){
        this(10);
    }
    /**
     * 構造函數 傳入 capacaity構造Array的容量
     * @param capacaity
     */
    public Array(int capacaity){
        data = (E[])new Object[capacaity];
        size = 0;
    }

    /**
     * 返回數組中容量大小
     * @return
     */
    public int getCapacaity() {
        return data.length;
    }

    /**
     * 返回容量size
     * @return
     */
    public int getSize() {
        return size;
    }

    /**
     * 數組是否爲空
     * @return
     */
    public boolean isEmpty(){
        return size == 0;
    }

    /**
     * 向最後一位添加數據
     * @param e
     */
    public void addLast(E e){
        /*if (size == data.length){
            throw  new IllegalArgumentException("AddLast faied. Array is null");
        }
        data[size] = e;
        size ++;*/
        add(size,e);
    }
    /**
     * 向第一一位添加數據
     * @param e
     */
    public void addFirst(E e){
        add(0,e);
    }
    /**
     * 在index插入一個新的元素e
     * @param index
     * @param e
     */
    public void add(int index,E e){

        if (index < 0 || index > size){
            throw  new IllegalArgumentException("Add faied. Array Require index>= 0 and index <= size");
        }

        if (size == data.length){
            //這裏進行空間擴容 擴容2倍
            this.resize(2 * data.length);
           // throw  new IllegalArgumentException("Add faied. Array is null");
        }
        for(int i = size-1; i >= index; i--) {
            data[i+1] = data[i];
        }
        data[index] = e;
        size ++;
    }



    /**
     * 通過下標獲取元素
     * @param index
     * @return
     */
    public E get(int index){
        if(index <0 || index >= size){
            throw  new IllegalArgumentException("Get faied. Array is null");
        }
        return  data[index];
    }

    /**
     * 拿到最後一個元素
     * @return
     */
    public E getLast(){
      return get(size - 1);
    }

    /**
     * 拿到第一個元素
     * @return
     */
    public E getFirst(){
        return get(0);
    }
    /**
     * 根據下標更新
     * @param index
     * @return
     */
    void set(int index,E e){
        if(index <0 || index >= size){
            throw  new IllegalArgumentException("Get faied. Array is null");
        }
          data[index] = e;
    }

    /**
     * 是否存在該值
     * @param e
     * @return
     */
    public boolean contains(E e){
        for (int i = 0; i < size; i++) {
          if (data[i].equals(e) ){
              return  true;
          }
        }
        return  false;
    }

    /**
     * 返回傳入的值的索引如果沒有返回-1
     * 不考慮多個值索引
     * @param e
     * @return
     */
    public int find(E e){
        for (int i = 0; i < size; i++) {
            if (data[i].equals(e)){
                return  i;
            }
        }
        return  -1;
    }
    /**
     * 返回傳入的值的在數組中存在多少個 沒有返回0
     * 不考慮多個值索引
     * @param e
     * @return
     */
    public int findCout(E e){
        int count = 0;
        for (int i = 0; i < size; i++) {
            if (data[i].equals(e)){
                count ++;
            }
        }
        return  count;
    }


    /**
     * 根據下標刪除
     */
    /**
     * 根據index索引刪除 並返回刪除的索引值
     * @param index
     * @param
     */
    public E remove(int index){
        if (index < 0 || index > size){
            throw  new IllegalArgumentException("Remove faied. Array Require index>= 0 and index <= size");
        }
        E ret = data[index];
        for(int i = index+1; i < size; i++) {
            data[i-1] = data[i];
            System.out.println(i);
        }

        size --;//注意size --後還存在一個值只不過用戶訪問不到這個值
        data[size] = null;//讓jvm回收機制回收 不是必填的 loitering objects != memory leak
        /**
         * 進行空間減少  lazy 減少 防止複雜度震盪  size = 4/1的時候減少空間
         */
        if (size == data.length / 4 &&  data.length / 2 != 0){
            resize(data.length / 2);
        }
        return  ret;
    }

    /**
     * 刪除數組中第一個元素
     * @param
     * @return
     */
    public E removeFirst(){
        return remove(0);
    }

    /**
     * 刪除最後一個下標
     * @param
     * @return
     */
    public E removeLast(){
        return remove(size-1);
    }

    /**
     * 如果存在該值則刪除 刪除單個
     * @param e
     */
    public void romoveElement(E e){
      int index = find(e);
      if (index != -1){
          remove(index);
      }
    }

    /**
     * 如果存在該值則刪除 刪除數組中全部e值
     * @param e
     */
    public void romoveElementAll(E e){
        System.err.println(data.length);
        E newData[] =(E[])new Object[data.length];
        int index = 0;
        for(int i = 0; i < size; i++) {
           if (!data[i].equals(e)){
               newData[index] = data[i];
               index ++;
           }
        }
        size = index;
        data = newData;
        /**
         * 進行空間減少 lazy 減少 防止複雜度震盪  size < 4/1的時候減少空間
         */
        if (size < data.length / 4 &&  data.length / 2 != 0){
            resize(data.length / 2);
        }
    }
    /**
     * toString 方法
     */
    @Override
    public String toString(){
        StringBuilder builder = new StringBuilder();
        builder.append(String.format("Array: size = %d , capacaity = %d\n",size,data.length));
        builder.append("[ ");
        for (int i = 0; i < size; i++) {
            builder.append(data[i]);
            if (i != size-1){
                builder.append(" , ");
            }
        }
        builder.append(" ]");
        return builder.toString();
    }
    /**
     * 擴容空間
     * @param  //擴容的數量
     */
    private void resize(int newCapacaity){
        E newData[] =(E[])new Object[newCapacaity];
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }
        data =  newData;
    }
}

測試類

package com.company;

/**
 * 聲明數組
 */
public class Main {

    public static void main(String[] args) {
        Array<Integer> array = new Array<>();
        array.addLast(11);
        array.addLast(2);
        array.addLast(3);
        array.addLast(4);
        array.addLast(1);
        array.addLast(1);
        array.addLast(1);
        array.addLast(1);
        array.addLast(9);
        System.out.println(array);

        array.add(6,99);
        array.addFirst(0);
        System.out.println(array);
        array.romoveElementAll(1);
        System.out.println(array);


    }
}

 

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