跳轉到內容

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
華夏公益教科書