用java實現一個簡單的ArrayList

重複造輪子雖然不可取,但是溫習一下數據結構,光看不做總是少了什麼,所以也來實現一下List,希望多多包涵。

既然要實現一個List,先來簡單說一下List的定義

線性表是最基本、最簡單、也是最常用的一種數據結構。
線性表中數據元素之間的關係是一對一的關係,即除了第一個和最後一個數據元素之外,其它數據元素都是首尾相接的
(注意,這句話只適用大部分線性表,而不是全部。比如,循環鏈表邏輯層次上也是一種線性表(存儲層次上屬於鏈式存儲),
但是把最後一個數據元素的尾指針指向了哨位結點)。
我們說“線性”和“非線性”,只在邏輯層次上討論,而不考慮存儲層次,
所以雙向鏈表和循環鏈表依舊是線性表。
在數據結構邏輯層次上細分,線性表可分爲一般線性表和受限線性表。
一般線性表也就是我們通常所說的“線性表”,可以自由的刪除或添加結點。受限線性表主要包括棧和隊列,受限表示對結點的操作受限制。
因此,線性表這種數據結構在實際應用中是廣泛採用的一種數據結構

以上爲百度百科的定義。我們這次實現的是順序存儲結構的線性表。按照順序讀取和存儲。

1.首先用接口把線性表需要實現的操作聲明。爲了圖省事,其他的常用操作未進行定義,可以自己去實現。所有的add,remove等操作都沒有進行boolean值的返還。

public interface CetrinwList<E> {
    /**
     * 取得數據
     */
    E get(int index);

    /**
     * 新增數據
     */
    void add(E e);

    /**
     * 移除數據
     */
    void remove(int index);

    /**
     * 插入數據
     */
    void insert(int index,E e);

    /**
     * 是否存在數據
     * @return
     */
    boolean contains(Object o);

    /**
     * 獲得List長度
     * @return
     */
    int size();

    /**
     * 是否爲空
     * @return
     */
    boolean isEmpty();

    /**
     * 清空
     */
    void clearList();
}

2.實現定義好的接口。

public class CetrinwArrayList<E> implements CetrinwList<E>{

    /**
     * 數組默認長度
     */
    private static final int DEFAULT_SIZE = 10;

    /**
     * 存儲隊列中的元素
     */
    private Object[] elements = null;

    /**
     *數組大小指針
     */
    private int capacity;

    /**
     * 當前遊標
     */
    private int current;


    public CetrinwArrayList(){
        this(DEFAULT_SIZE);
    }

    public CetrinwArrayList(int size){
        if(size < 0){
            throw new RuntimeException("數組大小不能小於0");
        }else{
            this.elements = new Object[size];
            this.current = 0;
            capacity = size;
        }
    }

    public E get(int index) {
        confirmIndex(index);
        return (E) this.elements[index];
    }

    public void add(E e) {
        confirmSize();
        this.elements[current] = e;
        this.current++;
    }

    public void remove(int index) {
        confirmIndex(index);
        for (int i = index; i < elements.length; i++) {
            if(i + 1 < elements.length){
                elements[i] = elements[i+1];
            }
        }
        current--;
    }

    public void insert(int index,E e) {
        confirmIndex(index);
        for (int i = 0; i < elements.length; i++) {
            if(i >= index && i+2 < elements.length){
                elements[i] = e;
                elements[i+1] = elements[i+2];
            }
        }
        current++;
    }

    public boolean contains(Object o) {
        for (Object element : this.elements) {
            if(o.equals(element)){
                return true;
            }
        }
        return false;
    }

    public int size() {
        return this.current;
    }

    public boolean isEmpty() {
        if(this.current >0){
            return true;
        }
        return false;
    }

    public void clearList() {
        elements = new Object[DEFAULT_SIZE];
    }

    /**
     * 確認當前數組的容量,如果滿足,則不操作,如果不滿足,則增加空間
     */
    private void confirmSize(){
        if(this.current == this.capacity){
            this.capacity = this.capacity + this.DEFAULT_SIZE;
            Object[] newElemets = new Object[this.capacity];

            for (int i = 0; i < this.elements.length; i++) {
                newElemets[i] = this.elements[i];
            }

            this.elements = newElemets;
        }
    }

    /**
     * 判斷下標是否越界
     */
    private void confirmIndex(int index){
        if(index > capacity || index < 0){
            throw new RuntimeException("下標越界");
        }
    }
}

3.Junit的測試類

@Test
    public void cetrinWArrayListTest(){
        CetrinwList<String> list = new CetrinwArrayList<String>();

        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");

        System.out.println("下標爲3的元素爲"+list.get(3));
        System.out.println("數組size:"+list.size());
        list.remove(2);
        System.out.print("remove後的數組size:"+list.size());

        System.out.println("remove後的數組:");
        for (int i = 0; i < list.size() ; i++) {
            System.out.print(list.get(i)+",");
        }

        list.insert(3,"gg");

        System.out.println("");
        System.out.println("insert後的數組:");
        for (int i = 0; i < list.size() ; i++) {
            System.out.print(list.get(i)+",");
        }
    }

4.運行結果

下標爲3的元素爲d
數組size:4
remove後的數組size:3remove後的數組:
a,b,d,
insert後的數組:
a,b,d,gg,

以上就是java實現的一個簡單的ArrayList。

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