javascript------列表

news/2024/5/17 0:27:54

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

列表是一组有序的数据。每个列表中的数据称之为元素。在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);

 

 

 

 

 

 

 


http://www.niftyadmin.cn/n/3655847.html

相关文章

.Net Micro Framework研究—模拟器改造

试验平台&#xff1a;.Net Micro Framework 模拟器由于Digi提供的开发板没有LCD显示屏&#xff0c;所以有关绘图方面的操作&#xff0c;只好在模拟器上进行了。如果大家参加了9月18日在北京召开的.Net Micro Framework2007技术大会&#xff0c;并且耐心等到最后&#xff0c;大会…

JavaScript ----- 学习栈

站就是和列表类似的一种数据结构&#xff0c;它可用来解决计算机世界里的很多问题。栈是一种高效的数据结构&#xff0c;因为数据只能在栈顶添加或删除&#xff0c;所以这样的操作很快&#xff0c;而且容易实现。栈的使用遍布程序语言实现的方方面面&#xff0c;从表达式求值到…

.Net Micro Framework研究—IO读写

试验平台&#xff1a;Digi MF开发板&#xff08;图MF071028001.jpg&#xff09;与IO相关的部分如下&#xff1a;&#xff08;3&#xff09;拨码开关SW1 &#xff08;4&#xff09;拨码开关SW2 &#xff08;11&#xff09;GPIO灯—output &#xff08;10&#xff09;GPIO—input…

JavaScript----- 列表练习题

增加一个向列表中插入元素的方法&#xff0c;该方法只在待插元素大于列表中的所有元素时才执 行插入操作。这里的大于有多重含义&#xff0c;对于数字&#xff0c;它是指数值上的大小;对于字母&#xff0c;它 是指在字母表中出现的先后顺序。 题目 分析 1、一个向列表中插入…

.NET Framework/.NET Compact Framework/.NET Micro Framework功能集比较

该资料来源于三亚许云老师的 .NET Micro Framework的讲座&#xff0c;图片中红色部分表示支持的功能&#xff0c;绿色部分表示不支持&#xff0c;不过该图片我看了应该不是最新的&#xff0c;如.NET Compact Framework &#xff0c;xml是支持序列化的&#xff0c;但图片上显示不…

javaScript --- 队列学习

队列是一种列表&#xff0c;不同的是队列只能在队尾插入元素&#xff0c;在队首删除元素。 队列用于存储按 顺序排列的数据&#xff0c;先进先出&#xff0c;这点和栈不一样&#xff0c;在栈中&#xff0c;最后入栈的元素反而被优先处 理。 队列是一种先进先出(First-In-Firs…

.Net Micro Framework研究—Digi开发板初探

9月18日&#xff0c;.Net Mirco Framework 2007技术大会在北京召开&#xff08;相关文章请参见&#xff1a;http://blog.csdn.net/yefanqiu/archive/2007/09/18/1790404.aspx&#xff09;&#xff0c;张欣第一时间写了关于Digi开发板的相关文章&#xff08;文章请参见&#xff…

javaScript面试题整理 --- 什么是闭包,什么是立即执行函数,它的作用是什么?简单说一下闭包的使用场景

什么是闭包&#xff0c;简单说一下闭包的使用场景 要理解闭包&#xff0c;首先必须理解Javascript特殊的变量作用域 变量的作用域无非就是两种&#xff1a;全局变量和局部变量。 Javascript语言的特殊之处&#xff1a; 1、函数内部可以直接读取全局变量。 2、在函数外部自然无…