美文网首页
数据结构与算法JavaScript描述(1) —— 列表(Lis

数据结构与算法JavaScript描述(1) —— 列表(Lis

作者: fehysunny | 来源:发表于2017-12-30 09:30 被阅读29次

    一组有序的数据集合,集合中的每个数据项叫做元素,可对这些数据项进行增删改查操作。

    应用:存储数据,进行数据的简单查找和排序

    实现:

    class List {
    
        constructor() {
            this.elements = []
            this.pos = 0            // 列表的当前位置
        }
    
        // 返回列表中元素的个数
        get length() {
            return this.elements.length
        }
    
        // 清空列表中的所有元素
        clear() {
            this.elements = []
        }
    
        // 在列表中查找某一元素
        find(ele) {
            return this.elements.indexOf(ele)
        }
    
        // 返回列表的字符串形式
        toString() {
            return this.elements.toString()
        }
    
        // 在现有元素后插入新元素
        insert(after, ele) {
            if (this.find(after) > -1) {
                const index = this.find(after) + 1
                this.elements.splice(index, 0, ele)
                return true
            }
            return false
        }
    
        // 给列表添加元素
        append(ele) {
            this.elements.push(ele)
        }
    
        // 从列表中删除元素
        remove(ele) {
            if (this.find(ele) > -1) {
                this.elements.splice(this.find(ele), 1)
                return true
            }
            return false
        }
    
        // 返回列表的当前位置
        currPos() {
            return this.pos
        }
    
        // 返回当前位置的元素
        getElement() {
            return this.elements[this.pos]
        }
    
        // 将列表的当前位置设移动到第一个元素
        front() {
            this.pos = 0
        }
    
        // 将列表的当前位置移动到最后一个元素
        end() {
            this.pos = this.length - 1
        }
    
        // 将当前位置前移一位
        prev() {
            if (this.pos > 0) {
                this.pos--
                return this.getElement()
            }
        }
    
        // 将当前位置后移一位
        next() {
            if (this.pos < this.length - 1) {
                this.pos++
                return this.getElement()
            }
        }
    
        // 将当前位置移动到指定位置
        moveTo(pos) {
            if (pos >= 0 && pos < this.length) {
                this.pos = pos
                return this.getElement()
            }
        }
    
        // 实现一个迭代器(Iterator),可以使用for...of...循环
        /**
         * next(): 返回 { value: all_type, done: Boolean }
         * value: 列表中的某个值
         * done: 标明迭代是否结束
         */
        [Symbol.iterator]() {
            this.pos = 0
            return {
                next: () => {
                    this.pos++
                    if (this.pos > this.length) {
                        return {
                            value: null,
                            done: true
                        }
                    } else {
                        return {
                            value: this.elements[this.pos - 1],
                            done: false
                        }
                    }
                }
            }
        }
    
    }
    

    示例:

    // test 
    var names = new List()
    names.append('Clayton')
    names.append('Raymond')
    names.append('Cynthia')
    names.append('Jennifer')
    names.append('Bryan')
    names.append('Danny')
    names.insert('Cynthia', 'Hysunny')
    console.log(names.toString())           // Clayton,Raymond,Cynthia,Hysunny,Jennifer,Bryan,Danny
    
    console.log(names.currPos())            // 0
    names.front()
    console.log(names.getElement())     // Clayton
    names.next()
    console.log(names.getElement())     // Raymond
    names.moveTo(4)                                     
    console.log(names.getElement())     // Bryan
    
    names.remove('Bryan')
    console.log(names.toString())           // Clayton,Raymond,Cynthia,Hysunny,Jennifer,Danny
    
    // 使用迭代器
    for (var name of names) {
        console.log(name)
    }
    // Clayton,Raymond,Cynthia,Hysunny,Jennifer,Danny
    
    
    names.clear()
    console.log(names.length)                   // 0
    

    相关文章

      网友评论

          本文标题:数据结构与算法JavaScript描述(1) —— 列表(Lis

          本文链接:https://www.haomeiwen.com/subject/tgdggxtx.html