BlitzMax/模块/数据结构/链表
链表允许您有效地向对象集合中添加和删除对象。
要创建链表,请使用 CreateList 函数。
使用 ListAddFirst 或 ListAddLast 将对象添加到链表中。这两个函数都返回一个链接对象,该对象可用于稍后使用 RemoveLink 函数删除该对象。您也可以使用 ListRemove 函数删除对象。但是,这不像使用 RemoveLink 那样高效,因为列表必须先搜索要删除的对象。
要访问链表中的所有对象,您可以使用 EachIn 循环。
重要的是要记住,链表中的基于索引的访问速度相对较慢。对于您想要索引的每个项目,链表必须遍历其内部链接,直到找到请求的索引,而数组可以直接访问任何位置的任何值。
您可能会问:“那么为什么要使用链表呢?” 将值插入到数组的中间是一个“昂贵”的操作,您必须将插入位置之后的所有项目在数组中向下移动一位,然后在创建的空间中插入新值。在链表中,您只需重定向链接之间的指针,您就可以立即将值插入到列表的中间。
通常最好在您需要对数据进行许多更改时使用链表,而在您需要频繁地随机访问数据时使用数组。如果您需要对数组进行许多插入和删除操作,您可以使用 ListFromArray 将其转换为列表,然后使用 ListToArray 将编辑后的列表转换回数组。
TList 使用的链接对象
- 值
- NextLink
- PrevLink
- 移除
方法 Value:Object()
描述:返回与该链接关联的对象。
示例:
' value.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Local link:TLink = list.FindLink("Item 2") Print String(link.Value())
方法 NextLink:TLink()
描述:返回列表中的下一个链接。
示例:
' nextlink.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Local link:TLink = list.FindLink("Item 2") Print String(link.NextLink().Value())
方法 PrevLink:TLink()
描述:返回列表中的上一个链接。
示例:
' prevlink.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Local link:TLink = list.FindLink("Item 2") Print String(link.PrevLink().Value())
方法 Remove()
描述:从列表中删除链接。
TList 使用的枚举器对象,用于实现 Eachin 支持。
链表
- 清空
- IsEmpty
- 包含
- AddFirst
- AddLast
- 第一
- 最后
- RemoveFirst
- RemoveLast
- FirstLink
- LastLink
- InsertBeforeLink
- InsertAfterLink
- FindLink
- ValueAtIndex
- 计数
- 移除
- 交换
- 复制
- 反转
- Reversed
- 排序
- ToArray
- FromArray
方法 Clear()
描述:清空链表
信息:从 list 中删除所有对象。
方法 IsEmpty()
描述:检查列表是否为空
返回:如果列表为空,则返回 True,否则返回 False
方法 Contains( value:Object )
描述:检查列表是否包含某个值
返回:如果列表包含 value,则返回 True,否则返回 False
方法 AddFirst:TLink( value:Object )
描述:将对象添加到列表的开头
返回:一个链接对象
方法 AddLast:TLink( value:Object )
描述:将对象添加到列表的末尾
返回:一个链接对象
方法 First:Object()
描述:返回列表中的第一个对象
信息:如果列表为空,则返回 Null。
示例:
' first.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Print String(list.First())
方法 Last:Object()
描述:返回列表中的最后一个对象
信息:如果列表为空,则返回 Null。
示例:
' last.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Print String(list.Last())
方法 RemoveFirst:Object()
描述:删除并返回列表中的第一个对象。
信息:如果列表为空,则返回 Null。
示例:
' removefirst.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") list.RemoveFirst() Local item:Object For item = EachIn list Print String(item) Next
方法 RemoveLast:Object()
描述:删除并返回列表中的最后一个对象。
信息:如果列表为空,则返回 Null。
示例:
' removelast.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") list.RemoveLast() Local item:Object For item = EachIn list Print String(item) Next
方法 FirstLink:TLink()
描述:返回列表中的第一个链接,如果列表为空,则返回 null。
示例:
' firstlink.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Local link:TLink = list.FirstLink() Print String(link.Value())
方法 LastLink:TLink()
描述:返回列表中的最后一个链接,如果列表为空,则返回 null。
示例:
' lastlink.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Local link:TLink = list.LastLink() Print String(link.Value())
方法 InsertBeforeLink:TLink( value:Object,succ:TLink )
描述:在指定的列表链接之前插入一个对象。
评论:此方法不检查给定的链接是否为空(可能会导致编译器错误)。
方法 InsertAfterLink:TLink( value:Object,pred:TLink )
描述:在指定的列表链接之后插入一个对象。
评论:此方法不检查给定的链接是否为空(可能会导致编译器错误)。
示例:
' insertafterlink.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") list.AddLast("Item 4") list.Remove("Item 3") Local link:TLink = list.FindLink("Item 2") If link <> Null Then list.InsertAfterLink("New Item 3!", link) Local item:Object For item = EachIn list Print String(item) Next
方法 FindLink:TLink( value:Object )
描述:返回列表中具有给定值的第一个链接,如果未找到,则返回 null。
方法 ValueAtIndex:Object( index )
描述:返回给定索引处的链接的值。
信息:如果索引超出范围,则抛出异常(必须为 0..list.Count()-1 包含)。
示例:
' valueatindex.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Print String(list.ValueAtIndex(1))
方法 Count()
描述:计算列表长度
返回: list 中的对象数量。
方法 Remove( value:Object )
描述:从链表中删除对象
信息:Remove 在列表中扫描指定的值并删除其链接。
方法 Swap( list:TList )
描述:与指定的列表交换内容。
方法 Copy:TList()
描述:创建列表的完全相同副本。
示例:
' copy.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Local clone:TList = list.Copy() Local item:Object For item = EachIn clone Print String(item) Next
方法 Reverse()
描述:反转列表的顺序。
方法 Reversed:TList()
描述:创建一个新列表,它是此列表的反转版本。
示例:
' reversed.bmx Local list:TList = New TList list.AddLast("Item 1") list.AddLast("Item 2") list.AddLast("Item 3") Local reversed:TList = list.Reversed() Local item:Object For item = EachIn reversed Print String(item) Next
方法 Sort( ascending=True,compareFunc( o1:Object,o2:Object )=CompareObjects )
描述:以升序(默认)或降序排序列表。
信息:用户类型应该实现一个 Compare 方法才能进行排序。
方法 ToArray:Object[]()
描述:将列表转换为数组
返回:一个对象数组
函数 FromArray:TList( arr:Object[] )
描述:从数组创建列表
返回:一个新的链表
Function CreateList:TList()
描述: 创建一个链表
返回: 一个新的链表对象
示例:
' createlist.bmx ' create a list to hold some objects list:TList=CreateList() ' add some string objects to the list ListAddLast list,"one" ListAddLast list,"two" ListAddLast list,"three" ' enumerate all the strings in the list For a$=EachIn list Print a$ Next
Function ClearList( list:TList )
描述:清空链表
信息:从 list 中删除所有对象。
示例:
' clearlist.bmx Local list:TList = CreateList() ListAddFirst(list, "Item 1") ListAddFirst(list, "Item 2") ClearList(list) Local item:Object For item = EachIn list Print String(item) Next
Function CountList( list:TList )
描述:计算列表长度
返回: list 中的对象数量。
注释: 请注意,此函数会遍历列表中的每个对象,这在频繁调用或列表很大时可能会很慢。
示例:
' countlist.bmx Local list:TList = CreateList() ListAddFirst(list, "Item 1") ListAddFirst(list, "Item 2") Print CountList(list)
Function ListIsEmpty( list:TList )
描述:检查列表是否为空
返回:如果列表为空,则返回 True,否则返回 False
示例:
' listisempty.bmx Local list:TList = CreateList() Print ListIsEmpty(list) ListAddFirst(list, "Item 1") Print ListIsEmpty(list)
Function ListContains( list:TList,value:Object )
描述:检查列表是否包含某个值
返回:如果列表包含 value,则返回 True,否则返回 False
示例:
' listcontains.bmx Local list:TList = CreateList() ListAddLast(list, "Item 1") ListAddLast(list, "Item 2") Print ListContains(list, "Item 2") Print ListContains(list, "Item 3")
Function SortList( list:TList,ascending=True,compareFunc( o1:Object,o2:Object )
描述: 对列表进行排序
注释: 可选的 ascending 和 compareFunc 允许修改默认排序方法。
示例:
' sortlist.bmx Local list:TList = CreateList() ListAddLast(list, "Item 3") ListAddLast(list, "Item 1") ListAddLast(list, "Item 4") ListAddLast(list, "Item 2") SortList(list) Local item:Object For item = EachIn list Print String(item) Next
Function ListFromArray:TList( arr:Object[] )
描述:从数组创建列表
返回:一个新的链表
示例:
' listfromarray.bmx Local array:String[] = ["Item 1", "Item 2", "Item 3"] Local list:TList = ListFromArray(array) Local item:Object For item = EachIn list Print String(item) Next
Function ListToArray:Object[]( list:TList )
描述:将列表转换为数组
返回:一个对象数组
示例:
' listtoarray.bmx Local array:Object[] Local list:TList = CreateList() ListAddLast(list, "Item 1") ListAddLast(list, "Item 2") ListAddLast(list, "Item 3") array = ListToArray(list) Local index:Int For index = 0 To array.Length - 1 Print String(array[index]) Next
Function SwapLists( list_x:TList,list_y:TList )
描述: 交换两个列表的内容
示例:
' swaplists.bmx Local list:TList = ListFromArray(["Item 1", "Item 2", "Item 3"]) Local list2:TList = ListFromArray(["Item A", "Item B", "Item C"]) SwapLists(list, list2) Local item:Object For item = EachIn list Print String(item) Next For item = EachIn list2 Print String(item) Next
Function ReverseList( list:TList )
描述: 反转列表元素的顺序
示例:
' reverselist.bmx Local list:TList = CreateList() ListAddLast(list, "Item 1") ListAddLast(list, "Item 2") ListAddLast(list, "Item 3") ReverseList(list) Local item:Object For item = EachIn list Print String(item) Next
Function ListFindLink:TLink( list:TList,value:Object )
描述: 在列表中查找链接
返回: 包含 value 的链接
注释: 如果未找到值,则返回 Null。
Function ListAddLast:TLink( list:TList,value:Object )
描述: 将一个对象添加到链表
返回:一个链接对象
示例:
' listaddlast.bmx Local list:TList = CreateList() ListAddLast(list, "Item 1") ListAddLast(list, "Item 2") Local item:Object For item = EachIn list Print String(item) Next
Function ListAddFirst:TLink( list:TList,value:Object )
描述: 将一个对象添加到链表
返回:一个链接对象
示例:
' listaddfirst.bmx Local list:TList = CreateList() ListAddFirst(list, "Item 1") ListAddFirst(list, "Item 2") Local item:Object For item = EachIn list Print String(item) Next
Function ListRemove( list:TList,value:Object )
描述:从链表中删除对象
信息: ListRemove 在列表中扫描指定的值并删除其链接。
注释: 这只删除该值的第一个实例。
示例:
' listremove.bmx Local list:TList = CreateList() ListAddLast(list, "Item 1") ListAddLast(list, "Item 2") ListAddLast(list, "Item 3") ListAddLast(list, "Item 2") ListRemove(list, "Item 2") ' remove an object Local item:Object For item = EachIn list Print String(item) Next
Function RemoveLink( link:TLink )
描述:从链表中删除对象
信息: RemoveLink 比 ListRemove 更有效。
示例:
' removelink.bmx Local list:TList = CreateList() ListAddLast(list, "Item 1") ListAddLast(list, "Item 2") ListAddLast(list, "Item 3") Local link:TLink = ListFindLink(list, "Item 2") ' find a link If link <> Null Then RemoveLink(link) ' remove it Local item:Object For item = EachIn list Print String(item) Next