JS數據結構二次封裝咱們的數組

GitHub更新 https://github.com/liangfengbo/javascript-data-structures-and-algorithmsjavascript

目錄

  1. 新建一個myArray類
  2. 在這個類上初始化構造函數
  3. 增長數組成員方法
  4. 增長數組添加元素方法
  5. 增長數組中移除元素方法
  6. 增長數組中查詢元素和修改元素方法
  7. 增長數組中包含,搜索方法
  8. 測試封裝數組的方法
  9. 方法說明
  10. 完整二次封裝數組代碼

1、新建一個myArray類

class myArray {
    
}

2、在這個類上初始化構造函數

/**
 * 初始化構造函數
 * @param capacity 容量
 */
constructor(capacity) {
    // 初始化arr變量
    this.arr = capacity === undefined ? [] : new Array(capacity);
    // 數組長度
    this.length = 0;
    // 數組容量
    this.capacity = capacity;
}

3、增長數組成員方法

// 獲取數組的長度
getLength() {
    return this.length;
}

// 獲取數組的容量
getCapacity() {
    return this.arr.length;
}

// 判斷數組是否爲空
isEmpty() {
    return this.length === 0;
}

4、增長數組添加元素方法

/**
 * 在數組中在index插入一個新的元素e
 * @param index 索引
 * @param e 元素
 * 原理:
 * 首先在傳進來index索引的位置向後面移動一位,
 * 而後把該index索引騰空出來放進傳入的新的元素e,
 * 最後維護一下length,長度加1
 */
add(index, e) {

    if (this.length === this.arr.length) {
        throw new Error('Add failed. Array is full.')
    }

    if (index < 0 || index > this.length) {
        throw new Error('Add failed. Request index >= 0 and index <= length');
    }

    for (let i = this.length - 1; i >= index; i--) {
        this.arr[i + 1] = this.arr[i];
    }

    this.arr[index] = e;
    this.length++;
}


// 向數組首位添加一個新元素e
addFirst(e) {
    this.add(0, e)
}

// 向數組全部的元素後面添加一個新元素e
addLast(e) {
    this.add(this.length, e);
}

5、增長數組中移除元素方法

/**
 * 從數組中刪除index位置的元素,返回刪除的元素
 * @param index
 * @returns {*}
 * 原理:
 * 首先找到索引index的位置,
 * 而後把索引後面的元素都向前移動一位,實際上是把索引後面的翻蓋前面一位的元素
 * 最後維護一下length,減一
 *
 */
remove(index) {
    if (index < 0 || index >= this.length) {
        throw new Error('Remove failed. Request index >= 0 and index <= length');
    }

    let ret = this.arr[index];
    for (let i = index + 1; i < this.length; i++) {
        this.arr[i - 1] = this.arr[i];
    }
    this.length--;

    return ret;
}

// 從數組中刪除第一個元素,返回刪除的元素
removeFirst() {
    return this.remove(0)
}

// 從數組中刪除最好個元素,返回刪除的元素
removeLast() {
    return this.remove(this.length - 1)
}

// 從數組中刪除元素e
removeElement(e) {
    let index = this.findIndex(e);
    if (index != -1) {
        this.remove(index);
    }
}

6、增長數組中查詢元素和修改元素方法

// 獲取index索引位置的元素
get(index) {
    if (index < 0 || index >= this.length) {
        throw new Error('Get failed. Index is illegal.');
    }
    return this.arr[index];
}

// 修改index索引的元素e
set(index, e) {
    if (index < 0 || index >= this.length) {
        throw new Error('Get failed. Index is illegal.');
    }
    this.arr[index] = e;
}

7、增長數組中包含,搜索方法

// 查詢數組是否包含e元素
contains(e) {
    for (let i = 0; i < this.length; i++) {
        if (this.arr[i] === e) {
            return true;
        }
    }
    return false;
}

// 查找數組中元素所在的所在的索引,若是不存在e,則返回-1
findIndex(e) {
    for (let i = 0; i < this.length; i++) {
        if (this.arr[i] === e) {
            return i;
        }
    }
    return -1;
}

// 把數組轉換爲字符串,並返回結果
toString() {
    let res = "";
    console.log(`Array: length = ${this.length}, capacity = ${this.capacity}.`);

    res += "[";
    for (let i = 0; i < this.length; i++) {
        res += this.arr[i];
        if (i !== this.length - 1) {
            res += ', '
        }
    }
    res += "]";

    return res.toString();
}

8、測試封裝數組的方法

// 使用咱們的類數組,聲明一個容量爲20的數組
let arr = new myArray(20);
// 首位增長數據
arr.addFirst('波波');
console.log(arr.toString());
// 輸出:Array: length = 1, capacity = 20.
// 輸出:[波波]

for (let i = 0; i < 10; i++) {
    arr.addLast(i)
}
console.log(arr.toString());
// 輸出:Array: length = 11, capacity = 20.
// 輸出:[波波, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

console.log(arr.findIndex(4)); // 5

// ...

9、方法說明

方法 描述 參數 參數說明 示例
getLength 返回數組的長度 getLength()
getCapacity 返回數組的容量 getCapacity()
isEmpty 判斷數組是否爲空,返回布爾值 isEmpty()
addFirst 向數組首位添加一個新元素 e 新元素 addFirst(e)
addLast 向數組全部的元素後面添加一個新元素 e 新元素 addLast(e)
add 在數組中在index插入一個新的元素e index, e index索引,e 新元素 add(index, e)
remove 從數組中刪除index位置的元素,返回刪除的元素 index 索引 remove(index)
removeFirst 從數組中刪除第一個元素,返回刪除的元素 removeFirst()
removeLast 從數組中刪除最後的元素,返回刪除的元素 removeLast()
removeElement 從數組中刪除元素e e 刪除的元素e removeElement(e)
get 獲取index索引位置的元素 index 索引 get(index)
set 修改index索引的元素e index, e index 索引,e新替換的元素 set(index, e)
contains 查詢數組是否包含e元素 e 查詢包含的元素 contains(e)
findIndex 查找數組中e元素所在的所在的索引,若是不存在e,則返回-1 e 查詢的元素 findIndex(e)
toString 返回數組格式化數據 toString()

10、完整二次封裝數組代碼

class myArray {
    /**
     *  初始化構造函數
     * @param capacity 容量
     */
    constructor(capacity) {
        // 初始化arr變量
        this.arr = capacity === undefined ? [] : new Array(capacity);
        // 數組長度
        this.length = 0;
        // 數組容量
        this.capacity = capacity;
    }

    // 獲取數組的長度
    getLength() {
        return this.length;
    }

    // 獲取數組的容量
    getCapacity() {
        return this.arr.length;
    }

    // 判斷數組是否爲空
    isEmpty() {
        return this.length === 0;
    }

    addFirst(e) {
        this.add(0, e)
    }

    // 向全部的元素後面添加一個新元素
    addLast(e) {
        this.add(this.length, e);
    }

    /**
     * 在數組中在index插入一個新的元素e
     * @param index 索引
     * @param e 元素
     * 原理:首先在傳進來index索引的位置向後面移動一位,
     * 而後把該index索引騰空出來放進傳入的新的元素e,
     * 最後維護一下length,長度加1
     */
    add(index, e) {

        if (this.length === this.arr.length) {
            throw new Error('Add failed. Array is full.')
        }

        if (index < 0 || index > this.length) {
            throw new Error('Add failed. Request index >= 0 and index <= length');
        }

        for (let i = this.length - 1; i >= index; i--) {
            this.arr[i + 1] = this.arr[i];
        }

        this.arr[index] = e;
        this.length++;
    }

    /**
     * 從數組中刪除index位置的元素,返回刪除的元素
     * @param index
     * @returns {*}
     * 原理:
     * 首先找到索引index的位置,
     * 而後把索引後面的元素都向前移動一位,實際上是把索引後面的翻蓋前面一位的元素
     * 最後維護一下length,減一
     *
     */
    remove(index) {
        if (index < 0 || index >= this.length) {
            throw new Error('Remove failed. Request index >= 0 and index <= length');
        }

        let ret = this.arr[index];
        for (let i = index + 1; i < this.length; i++) {
            this.arr[i - 1] = this.arr[i];
        }
        this.length--;

        return ret;
    }

    // 從數組中刪除第一個元素,返回刪除的元素
    removeFirst() {
        return this.remove(0)
    }

    // 從數組中刪除最好個元素,返回刪除的元素
    removeLast() {
        return this.remove(this.length - 1)
    }

    // 從數組中刪除元素e
    removeElement(e) {
        let index = this.findIndex(e);
        if (index != -1) {
            this.remove(index);
        }
    }


    // 獲取index索引位置的元素
    get(index) {
        if (index < 0 || index >= this.length) {
            throw new Error('Get failed. Index is illegal.');
        }
        return this.arr[index];
    }

    // 修改index索引的元素e
    set(index, e) {
        if (index < 0 || index >= this.length) {
            throw new Error('Get failed. Index is illegal.');
        }
        this.arr[index] = e;
    }

    // 查詢數組是否包含e元素
    contains(e) {
        for (let i = 0; i < this.length; i++) {
            if (this.arr[i] === e) {
                return true;
            }
        }
        return false;
    }

    // 查找數組中元素所在的所在的索引,若是不存在e,則返回-1
    findIndex(e) {
        for (let i = 0; i < this.length; i++) {
            if (this.arr[i] === e) {
                return i;
            }
        }
        return -1;
    }

    // 把數組轉換爲字符串,並返回結果
    toString() {
        let res = "";
        console.log(`Array: length = ${this.length}, capacity = ${this.capacity}.`);

        res += "[";
        for (let i = 0; i < this.length; i++) {
            res += this.arr[i];
            if (i !== this.length - 1) {
                res += ', '
            }
        }
        res += "]";

        return res.toString();
    }
}

// 測試
// 使用咱們的類數組,聲明一個容量爲20的數組
let arr = new myArray(20);
// 首位增長數據
arr.addFirst('波波');
console.log(arr.toString());
// 輸出:Array: length = 1, capacity = 20.
// 輸出:[波波]

for (let i = 0; i < 10; i++) {
    arr.addLast(i)
}
console.log(arr.toString());
// 輸出:Array: length = 11, capacity = 20.
// 輸出:[波波, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

console.log(arr.findIndex(4)); // 5

// ...上面的方法均可以測試使用。
相關文章
相關標籤/搜索