當不需要在一個很長的序列中查找元素,或者對其進行排序,可以使用列表。如果數據結構非常復雜,就使用別的數據結構。
一個簡單列表的例子:
1 /** 2 * 一個簡單的列表 3 * @constructor 4 */ 5 var List = function () { 6 this.listSize = 0; 7 this.pos = 0; 8 this.dataSource = [];//初始化一個數組來保存列表元素 9 }; 10 List.prototype = (function () { 11 return { 12 clear: clear, 13 find: find, 14 toString: toString, 15 insert: insert, 16 append: append, 17 remove: remove, 18 front: front, 19 end: end, 20 prev: prev, 21 next: next, 22 hasNext: hasNext, 23 hasPrev: hasPrev, 24 length: length, 25 currPos: currPos, 26 moveTo: moveTo, 27 getElement: getElement 28 }; 29 /** 30 * 給列表最后添加元素的時候,列表元素個數+1 31 * @param element 32 */ 33 function append(element) { 34 this.listSize++; 35 this.dataSource.push(element); 36 } 37 38 /** 39 * @param element 如果傳入的是對象,需要判斷是否是對象以及兩個對象是否相等 40 * @returns {number} 如果找到,返回位置,否則-1 41 */ 42 function find(element) { 43 for (var i = 0; i < this.dataSource.length; i++) { 44 if (this.dataSource[i] === element) { 45 return i; 46 } 47 } 48 return -1; 49 } 50 51 /** 52 * 返回列表元素的個數 53 * @returns {number} 54 */ 55 function length() { 56 return this.listSize; 57 } 58 59 /** 60 * 刪除元素成功,元素個數-1 61 * @param element 62 * @returns {boolean} 63 */ 64 function remove(element) { 65 var removeIndex = this.find(element); 66 if (removeIndex !== -1) { 67 this.dataSource.splice(removeIndex, 1); 68 this.listSize--; 69 return true; 70 } 71 return false; 72 } 73 74 /** 75 * 返回要展示的列表 76 * @returns {string} 77 */ 78 function toString() { 79 return this.dataSource.toString(); 80 } 81 82 /** 83 * 插入某個元素 84 * @param element 要插入的元素 85 * @param afterElement 列表中的元素之后 86 * @returns {boolean} 87 */ 88 function insert(element, afterElement) { 89 var insertIndex = this.find(afterElement); 90 if (insertIndex !== -1) { 91 this.dataSource.splice(insertIndex + 1, 0, element); 92 this.listSize++; 93 return true; 94 } 95 return false; 96 } 97 98 /** 99 * 清空列表中的所有元素 100 */ 101 function clear() { 102 delete this.dataSource; 103 this.dataSource = []; 104 this.listSize = this.pos = 0; 105 } 106 107 /** 108 * 將列表的當前位置移動到第一個元素 109 */ 110 function front() { 111 this.pos = 0; 112 } 113 114 /** 115 * 將列表的當前位置移動到最后一個元素 116 */ 117 function end() { 118 this.pos = this.listSize - 1; 119 } 120 121 /** 122 * 返回當前位置的元素 123 * @returns {*} 124 */ 125 function getElement() { 126 return this.dataSource[this.pos]; 127 } 128 129 /** 130 * 將當前位置向前移動一位 131 */ 132 function prev() { 133 --this.pos; 134 } 135 136 /** 137 * 將當前位置向后移動一位 138 */ 139 function next() { 140 ++this.pos; 141 } 142 143 /** 144 * 返回列表的當前位置 145 * @returns {number|*} 146 */ 147 function currPos() { 148 return this.pos; 149 } 150 151 /** 152 * 移動到指定位置 153 * @param position 154 */ 155 function moveTo(position) { 156 this.pos = position; 157 } 158 159 /** 160 * 判斷是否有后一位 161 * @returns {boolean} 162 */ 163 function hasNext() { 164 return this.pos < this.listSize; 165 } 166 167 /** 168 * 判斷是否有前一位 169 * @returns {boolean} 170 */ 171 function hasPrev() { 172 return this.pos >= 0; 173 } 174 }());
下面是一個基於列表的簡單應用:
假設有20部影碟,屬於一個TXT文件:
我用nodejs來讀取文件內容:
1 var fs = require('fs'); 2 var movies = createMovies('films.txt'); 3 /** 4 * 讀取數據,返回數組 5 * @param file 6 * @returns {Array|*} 7 */ 8 function createMovies(file) { 9 var arr = fs.readFileSync(file, 'utf-8').split("\n"); 10 for (var i = 0; i < arr.length; i++) { 11 arr[i] = arr[i].trim(); 12 } 13 return arr; 14 }
然后初始化影碟列表
1 var movieList = new List(); 2 for (var i = 0; i < movies.length; i++) { 3 movieList.append(movies[i]); 4 }
然后定義用戶列表和用戶前來拿影碟行為
1 var customers = new List(); 2 /** 3 * 用戶對象 4 * @param name 用戶姓名 5 * @param movie 用戶拿走的影碟 6 * @constructor 7 */ 8 var Customer = function (name, movie) { 9 this.name = name; 10 this.movie = movie; 11 }; 12 /** 13 * 用戶拿走影碟 14 * @param name 用戶的名字 15 * @param movie 影碟的名字 16 * @param movieList 所有影碟列表 17 * @param customerList 用戶列表 18 */ 19 function checkOut(name, movie, movieList, customerList) { 20 if (movieList.find(movie) !== -1) { 21 var user = new Customer(name, movie); 22 customerList.append(user);//用戶拿掉影碟,講用戶加入customerList 23 movieList.remove(movie);//從movieList中刪除掉被拿掉的影碟 24 } else { 25 console.log('沒有該電影'); 26 } 27 }
一切就緒之后測試一下之前的代碼
1 var fs = require('fs'); 2 var movies = createMovies('films.txt'); 3 var movieList = new List(); 4 var customers = new List(); 5 for (var i = 0; i < movies.length; i++) { 6 movieList.append(movies[i]); 7 } 8 checkOut('Jane', '肖申克的救贖', movieList, customers); 9 displayList(customers); 10 console.log('分割線-----------------'); 11 displayList(movieList);
結果:
Jane,肖申克的救贖 分割線----------------- 教父 教父2 低俗小說 黃金三鏢客 十二怒漢 辛德勒名單 黑暗騎士 指環王:王者歸來 搏擊俱樂部 星球大戰5:帝國反擊戰 飛越瘋人院 指環王:護戒使者 盜夢空間 好家伙 星球大戰 七武士 黑客帝國 阿甘正傳 上帝之城
總結:列表是一種自然的數據組織方式。如果數據存儲的順序不重要,列表是一種非常好的數據結構。
