天天看點

資料結構之可變長度數組-仿ArrayList實作

分析:

1. 實作一個能自動擴容的Array,基于數組實作
2. 有增删改查操作
3. 類似一個Arraylist結合,支援範型
           

1.構造函數

private E[] mDatas;
private int size;

public Array(int capacity){
    mDatas = (E[]) new Object[capacity];
    size = ;
}

public Array(){
    this();
}   
           

2. 添加資料

/**
 * 指定位置添加資料 能自動擴容
 * @param index
 * @param e
 */
public void add(int index,E e){

    assertIndex(index);

    //如果size == 數組的容量大小了 ,就把數組大小擴容為原來的兩倍
    if(size == mDatas.length){
        resize(  * size);
    }

    //往指定位置添加元素 就是把指定位置的元素都往右移 不過要從最後一個數開始移動 直到index
    for (int i = size - ; i >= index; i--) {
        mDatas[i + ] = mDatas[i];
    }
    mDatas[index] = e;
    size ++;
}

public void addFirst(E e){
    add(,e);
}

public void addLast(E e){
    add(size,e);
}
           

3. 删除資料

/**
 * 移除某一個位置的元素
 * @param index
 * @return
 */
public E remove(int index){

    assertIndex(index);
    E temp = mDatas[index];
    //删除某一個位置的元素就是從右往左移 把這個位置的元素用後面的元素覆寫掉
    for (int i = index + ; i < size; i++) {
        mDatas[i - ] = mDatas[i];
    }
    size--;
   // mDatas[index] = null;
    return temp;
}

/**
 * 删除頭部元素
 * @return
 */
public E removeFirst(){
    return remove();
}

/**
 * 删除尾部元素
 * @return
 */
public E removeLast(){
    return remove(size - );
}

 /**
 * 移除某一個元素 先查找這個元素 查找到元素了根據位置去删除
 * @param e
 * @return
 */
public E removeElement(E e){
    int index = findIndex(e);
    if(index != -){
        return remove(index);
    }
    return null;
}
           

4. 修改資料

/**
 * 修改某一個位置的元素
 * @param index
 * @param e
 */
public void set(int index,E e){
    assertIndex(index);
    mDatas[index] = e;
}
           

5. 查詢資料

/**
 * 擷取索引處的元素
 * @param index
 * @return
 */
public E get(int index){
    assertIndex(index);
    return mDatas[index];
}

public E getLast(){
    return get(size - );
}

public E getFirst(){
    return get();
}

/**
 * 根據元素查找元素索引
 * @param e
 * @return
 */
public int findIndex(E e){
    for (int i = ; i < mDatas.length; i++) {
        if(e.equals(mDatas[i])){
            return i;
        }
    }
    return -;
}

/**
 * 根據索引查找元素
 * @param index
 * @return
 */
public E find(int index){

    assertIndex(index);
    for (int i = ; i < mDatas.length; i++) {
        if(mDatas[index].equals(mDatas[i])){
            return mDatas[i];
        }
    }
    return null;
}
           

6. 數組擴容

/**
 * 擴容的函數
 * @param capacity
 */
private void resize(int capacity) {

    E[] newData = (E[]) new Object[capacity];
    for (int i = ; i < size; i++) {
        newData[i] = mDatas[i];
    }
    //擴容後的數組指派給原始數組
    mDatas = newData;
}
           

7. 小結

其實就是針對數組的操作
           

8.聯系方式

QQ:1509815887