javascript------列表

一、 列表的抽象数据类型定义
 

列表是一组有序的数据。每个列表中的数据称之为元素。在JavaScript中,列表中的元素可以是任意数据类型。列表中可以保存多少元素并没有事先限定,实际使用时元素的数量受到程序内存的限制。

属性

listSize         列表的元素个数

pos               列表的当前位置

length            返回列表中元素的个数

方法

clear()            清空列表中的所有元素

toString()       返回列表的字符串形式 

getElement()  返回当前位置的元素

insert()            在现有元素后插入新元素

append()          在列表的末尾添加新元素

remove()         从列表中删除元素

front()              将列表的当前位置移动到第一个元素

end()                将列表的当前位置移动到最后一个元素

prev()               将当前位置后移一位

next()                将当前位置前移一位

currPos()          返回列表的当前位置

moveTo()          将当前位置移动到指定位置

2 实现列表类

// 定义 list 类
		function 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.contains = contains;
		}
		// append 给列表添加元素
		function append(element) { // 给列表的下一个位置增加一个新的元素,元素的位置刚好等于变量listSize的值
			this.dataStore[this.listSize++] = element;
			// 当新元素就位后变量listSize 加 1;
		}

		// remove:  从列表中删除元素  删除一个一个元素需要先查找 利用 find()查找 
		// find 在列表中查找某一元素
		function find(element) { //在列表中查找某一元素 
			for (var i = 0; i < this.dataStore.length; ++i) {
				if (this.dataStore[i] == element) {
					return i;
				}
			}
			return -1;
		}

		function remove(element) { //remove:  从列表中删除元素
			var foundAt = this.find(element)
			if (foundAt > -1) {
				this.dataStore.splice(foundAt, 1);
				--this.listSize;
				return true;
			}
			return false;
		}
		// length : 列表中有多少个元素
		function length() {
			return this.listSize;
		}
		// toString  显示列表中的元素
		function toString() {
			return this.dataStore;
		}
		// insert: 向列表中插入一个元素
		function insert(element, after) {
			var insertPos = this.find(after);
			if (insertPos > -1) {
				this.dataStore.splice(insertPos + 1, 0, element);
				++this.listSize;
				return true;
				// insert() 方法用到了 find() 方法, find() 方法会寻找传入的 after 参数在列
				// 表中的位置, 找到该位置后, 使用 splice() 方法将新元素插入该位置之后, 然后将变量
				// listSize 加 1 并返回 true, 表明插入成功。
			}
			return false;
		}
		// clear: 清空列表中所有的元素
		// clear() 方法使用 delete 操作符删除数组 dataStore, 接着在下一行创建一个空数组。 最后一行将 listSize 和 pos 的值设为 1, 表明这是一个新的空列表。
		function clear() {
			delete this.dataStore;
			this.dataStore = [];
			this.listSize = this.pos = 0;
		}
		// contains: 判断给定值是否在列表中
		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];
		}
		var names = new List();
		names.append("Clayton");
		names.append("Raymond");
		names.append("Cynthia");
		names.append("Jennifer");
		names.append("Bryan");
		names.append("Danny");
		names.front();
		console.log(names.getElement()); // 显示 Clayton
		names.next();
		console.log(names.getElement()); // 显示 Raymond
		names.next();
		names.next();
		names.prev();
		console.log(names.getElement()); // 显示 Cynthia

上述代码段展示的这些行为实际上是迭代器的概念, 这也是接下来要讨论的内容。
 

3 使用迭代器访问列表

使用迭代器, 可以不必关心数据的内部存储方式, 以实现对列表的遍历。 前面提到的方法front()、 end()、 prev()、 next() 和 currPos 就实现了 cList 类的一个迭代器。 以下是和使用数组索引的方式相比, 使用迭代器的一些优点。
 

1、访问列表元素时不必关心底层的数据存储结构。
2、当为列表添加一个元素时, 索引的值就不对了, 此时只用更新列表, 而不用更新迭代器。
3、可以用不同类型的数据存储方式实现 cList 类, 迭代器为访问列表里的元素提供了一种统一的方式。
 

来看一个使用迭代器遍历列表的例子:

for(names.front(); names.currPos() < names.length(); names.next()) {
           print(names.getElement()); // Danny
}

// 本地没有运行成功 先记录到这

怎么运行都是一值循环最后一个 

打印发现  names.length 是20 

names.currPos返回的是19 

然后改下

for (let i = 0; i < list.length(); list.next()) {
        ++i;
        if (list.getElement() instanceof Customer) {
            print(list.getElement()["name"] + ", " +
                list.getElement()["movie"]);
        }
        else {
            print(list.getElement());
        }
    }

完整代码

// 定义 list 类
function 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.contains = contains;
}
// append 给列表添加元素
function append(element) { // 给列表的下一个位置增加一个新的元素,元素的位置刚好等于变量listSize的值
    this.dataStore[this.listSize++] = element;
    // 当新元素就位后变量listSize 加 1;
}

// remove:  从列表中删除元素  删除一个一个元素需要先查找 利用 find()查找 
// find 在列表中查找某一元素
function find(element) { //在列表中查找某一元素 
    for (var i = 0; i < this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return i;
        }
    }
    return -1;
}

function remove(element) { //remove:  从列表中删除元素
    var foundAt = this.find(element)
    if (foundAt > -1) {
        this.dataStore.splice(foundAt, 1);
        --this.listSize;
        return true;
    }
    return false;
}
// length : 列表中有多少个元素
function length() {
    return this.listSize;
}
// toString  显示列表中的元素
function toString() {
    return this.dataStore;
}
// insert: 向列表中插入一个元素
function insert(element, after) {
    var insertPos = this.find(after);
    if (insertPos > -1) {
        this.dataStore.splice(insertPos + 1, 0, element);
        ++this.listSize;
        return true;
        // insert() 方法用到了 find() 方法, find() 方法会寻找传入的 after 参数在列
        // 表中的位置, 找到该位置后, 使用 splice() 方法将新元素插入该位置之后, 然后将变量
        // listSize 加 1 并返回 true, 表明插入成功。
    }
    return false;
}
// clear: 清空列表中所有的元素
// clear() 方法使用 delete 操作符删除数组 dataStore, 接着在下一行创建一个空数组。 最后一行将 listSize 和 pos 的值设为 1, 表明这是一个新的空列表。
function clear() {
    delete this.dataStore;
    this.dataStore = [];
    this.listSize = this.pos = 0;
}
// contains: 判断给定值是否在列表中
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];
}
var names = new List();
names.append("Clayton");
names.append("Raymond");
names.append("Cynthia");
names.append("Jennifer");
names.append("Bryan");
names.append("Danny");

var movies = read('./films.txt').split("\n");

var movieList = new List();
var customers = new List();
function Customer(name, movie) {
    this.name = name;
    this.movie = movie;
}
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.");
    }
}
for (var i = 0; i < movies.length; ++i) {
    movieList.append(movies[i]);
}
function displayList(list) {
    for (let i = 0; i < list.length(); list.next()) {
        ++i;
        if (list.getElement() instanceof Customer) {
            print(list.getElement()["name"] + ", " +
                list.getElement()["movie"]);
        }
        else {
            print(list.getElement());
        }
    }
}

// displayList(movieList)
var name = readline();
putstr("What movie would you like? ");
var movie = readline();
checkOut(name, movie, movieList, customers);
print("\nCustomer Rentals: \n");
displayList(customers);
print("\nMovies Now Available\n");
displayList(movieList);

猜你喜欢

转载自blog.csdn.net/wanghongpu9305/article/details/109920715
今日推荐