跳转到内容

Monkey/语言/列表

来自维基教科书,开放的书籍,为开放的世界

什么是列表?

[编辑 | 编辑源代码]

在 Monkey 中,列表是一组封装在一个对象中的对象,并按顺序读取。列表可以向前、向后读取,逐个对象遍历,排序,并提供节点级访问以进行插入和查询。

示例

Class Obj
	Field x:Int, y:Int, z:Int

	Method New(xx:Int,yy:Int,zz:Int)
		x=xx; y=yy; z=zz
	End
End

Function Main()
	mylist = New List<Obj>
	mylist.AddLast(New Obj(1,1,1))
	mylist.AddLast(New Obj(2,2,2))
	mylist.AddFirst(New Obj(3,3,3))
		
	Print "list:"
		
	For Local o:Obj = Eachin mylist
		Print o.x+" "+o.y+" "+o.z
	Next
End

列表与其他对象一样,使用 'NEW' 关键字创建。它与其他对象的不同之处在于它需要一个类型说明符。类型说明符(或类型参数)使用大于和小于符号定义:< 和 >。在上面的示例中,列表 'mylist' 是 'Obj' 的列表,它是一个包含三个字段的类:x、y 和 z。

'EachIn' 将自动遍历列表,将对象分配给迭代变量。当遇到 NULL 时,EachIn 将退出循环,表示列表的结尾。


什么是节点?

[编辑 | 编辑源代码]

列表节点语法

Local mynode:list.Node<Obj>
mynode = mylist.FirstNode()


当对象添加到列表时,也会创建节点

Local mynode:list.Node<Obj> = mylist.AddLast(New Obj(4,4,4))


节点可以从列表中返回一个值

Local o:Obj = mynode.Value()

Print o.x+" "+o.y+" "+o.z


节点可以用来反向遍历列表

Local  mynode:list.Node<Obj> = mylist.LastNode()
		
While mynode
	Local o:Obj
	o = mynode.Value()

	Print o.x+" "+o.y+" "+o.z
			
	mynode = mynode.PrevNode() 
Wend


节点可以使用节点构造函数(New 命令)将值插入列表中

Local  mynode:list.Node<Obj> = mylist.FirstNode()
Local insertdata:Obj = New Obj(9,9,9)
		
While mynode	
	If mynode.Value.x = 2
		''insert after
		New list.Node<Obj>(  mynode.NextNode(), mynode, insertdata)
	Endif
			
	mynode = mynode.NextNode() 
Wend


节点可以从列表中删除一个值,但请确保在删除节点之前已完成该节点的操作

Local  mynode:list.Node<Obj> = mylist.FirstNode()
Local  removenode:list.Node<Obj>
		
While mynode	
	If mynode.Value.x = 2
		''remove
		removenode = mynode
	Endif
			
	mynode = mynode.NextNode()
	removenode.Remove()
Wend
华夏公益教科书