1. 程式人生 > >用java實現一個簡單的ArrayList

用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。