Javascript 列表List

作者: ak1947 | 来源:发表于2018-07-30 16:13 被阅读0次

    List是日常生活中使用最多的一种数据组织工具,例如购物单,运货单,排名表等。注意List不适合需要进行频繁排序或查找的场景。
    List中的元素是按顺序组织(存储)起来的。元素可以是任意类型。可以在列表的任意位置添加或删除元素。


    List的ADT(抽象数据类型)定义

    属性或函数 说明
    listSize list中元素个数
    pos 当前访问位置
    length 元素个数
    clear() 清除所有元素
    toString() list的字符串表示
    getElement() 获取返回当前位置pos的元素
    insert(ind) 指定位置后插入元素
    append() 在结尾添加元素
    remove() 删除元素
    front() 设置当前位置pos为首元素
    end() 设置当前位置pos为尾元素
    prev() 将当前位置回退一个元素
    next() 将当前位置前进一个元素
    currPos() 返回当前位置
    moveTo() 移动当前位置到指定位置

    List的类定义

    function List() {  // 定义class List
       this.listSize = 0;
       this.pos = 0;
       this.dataStore = [];  // 存储列表元素
       this.clear = clear;  // 此函数在后面定义
       this.find = find;
       this.toString = toString;
       this.insert = insert;
       this.append = append;
       this.remove = remove;
       this.front = front;
       this.end = end;
       this.prev = prev;
       this.next = next;
       this.length = length;
       this.currPos = currPos;
       this.moveTo = moveTo;
       this.getElement = getElement;
       this.length = length;
       this.contains = contains;
    }   
    
    function append(element) {
       this.dataStore[this.listSize++] = element;
    }
    
    function find(element) {
       for (var i = 0; i < this.dataStore.length; ++i) {
          if (this.dataStore[i] == element) {
             return i;
          }
       }
       return -1;  // 未找到时返回-1
    }
    
    function remove(element) {
       var foundAt = this.find(element);
       if (foundAt > -1) {
          this.dataStore.splice(foundAt,1);
          --this.listSize;
          return true;
       }
       return false;
    }
    
    function length() {
       return this.listSize;
    }
    
    function toString() {
        return this.dataStore;
    }
    
    function insert(element, after) {
       var insertPos = this.find(after);
       if (insertPos > -1) {
          this.dataStore.splice(insertPos+1, 0, element);
          ++this.listSize;
          return true;
       }
       return false;
    }
    
    function clear() {
       delete this.dataStore;
       this.dataStore = [];
       this.listSize = this.pos = 0;
    }
    
    function contains(element) {
       for (var i = 0; i < this.dataStore.length; ++i) {
          if (this.dataStore[i] == element) {
             return true;
          }
       }
       return false;
    }
    
    function front() {
       this.pos = 0;
    }
    
    function end() {
       this.pos = this.listSize-1;
    }
    
    function prev() {
       if (this.pos > 0) {
          --this.pos;
       }
    }
    
    function next() {
       if (this.pos < this.listSize-1) {
          ++this.pos;
       }
    }
    
    function currPos() {
       return this.pos;
    }
    
    function moveTo(position) {
       this.pos = position;
    }
    
    function getElement() {
       return this.dataStore[this.pos];
    }
    

    假设有文件films.txt包含如下内容:
    The Shawshank Redemption
    The Godfather
    The Godfather: Part II
    Pulp Fiction
    The Good, the Bad and the Ugly
    12 Angry Men
    Schindler’s List
    The Dark Knight
    The Lord of the Rings: The Return of the King
    Fight Club
    Star Wars: Episode V - The Empire Strikes Back
    One Flew Over the Cuckoo’s Nest
    The Lord of the Rings: The Fellowship of the Ring
    Inception
    Goodfellas
    Star Wars
    Seven Samurai
    The Matrix
    Forrest Gump
    City of God
    现在我们编程序使用List来管理电影数据

    // 读取电影清单,保存在数组中
    function createArr(file) {
       var arr = read(file).split("\n");
       for (var i = 0; i < arr.length; ++i) {
          arr[i] = arr[i].trim();
       }
       return arr;
    }
    
    // 创建List,保存电影
    var movieList = new List();
    for (var i = 0; i < movies.length; ++i) {
       movieList.append(movies[i]);
    }
    
    // 显示所有电影
    function displayList(list) {
       for (list.front(); list.currPos() < list.length(); list.next()) {
          print(list.getElement());
    }
    
    // 定义客户,假设客户可以借一部电影
    function Customer(name, movie) {
       this.name = name;
       this.movie = movie;
    }
    
    // list中存储的是Customer对象,显示所有Customer信息
    function displayList(list) {
       for (list.front(); list.currPos() < list.length(); list.next()) {
          if (list.getElement() instanceof Customer) {  // 使用 instanceof 判断对象类型
             print(list.getElement()["name"] + ", " +
                   list.getElement()["movie"]);
          }
          else {
             print(list.getElement());
          }
       }
    }
    
    // 借阅电影
    function checkOut(name, movie, filmList, customerList) {
       if (movieList.contains(movie)) {
          var c = new Customer(name, movie);
          customerList.append(c);
          filmList.remove(movie);
       }
       else {
          print(movie + " is not available.");
       }
    }
    

    总结

    List是一种非常常用的数据结构,提供了灵活的访问接口。适合管理有序数据,但要注意其查询和插入效率都是O(n),较费时。可以使用instanceof关键字判断对象的类型。

    相关文章

      网友评论

        本文标题:Javascript 列表List

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