mirror of
https://github.com/hlccd/goSTL.git
synced 2025-01-31 12:19:32 +08:00
306 lines
9.3 KiB
Go
306 lines
9.3 KiB
Go
package Iterator
|
||
|
||
//@Title Iterator
|
||
//@Description
|
||
// 迭代器
|
||
// 定义了一套迭代器接口和迭代器类型
|
||
// 本套接口定义了迭代器所要执行的基本函数
|
||
// 数据结构在使用迭代器时需要重写函数
|
||
// 其中主要包括:生成迭代器,移动迭代器,判断是否可移动
|
||
|
||
//Iterator迭代器
|
||
//包含泛型切片和该迭代器当前指向元素的下标
|
||
//可通过下标和泛型切片长度来判断是否可以前移或后移
|
||
//当index不小于0时迭代器可前移
|
||
//当index小于data的长度时可后移
|
||
type Iterator struct {
|
||
data *[]interface{} //该迭代器中存放的元素集合的指针
|
||
index int //该迭代器当前指向的元素下标,-1即不存在元素
|
||
}
|
||
|
||
//Iterator迭代器接口
|
||
//定义了一套迭代器接口函数
|
||
//函数含义详情见下列描述
|
||
type Iteratorer interface {
|
||
Begin() (I *Iterator) //将该迭代器设为位于首节点并返回新迭代器
|
||
End() (I *Iterator) //将该迭代器设为位于尾节点并返回新迭代器
|
||
Get(idx int) (I *Iterator) //将该迭代器设为位于第idx节点并返回该迭代器
|
||
Value() (e interface{}) //返回该迭代器下标所指元素
|
||
HasNext() (b bool) //判断该迭代器是否可以后移
|
||
Next() (b bool) //将该迭代器后移一位
|
||
HasPre() (b bool) //判罚该迭代器是否可以前移
|
||
Pre() (b bool) //将该迭代器前移一位
|
||
}
|
||
|
||
//@title New
|
||
//@description
|
||
// 新建一个Iterator迭代器容器并返回
|
||
// 传入的切片指针设为迭代器所承载的元素集合
|
||
// 若传入下标,则将传入的第一个下标设为该迭代器当前指向下标
|
||
// 若该下标超过元素集合范围,则寻找最近的下标
|
||
// 若元素集合为空,则下标设为-1
|
||
//@receiver nil
|
||
//@param data *[]interface{} 迭代器所承载的元素集合的指针
|
||
//@param Idx ...int 预设的迭代器的下标
|
||
//@return i *Iterator 新建的Iterator迭代器指针
|
||
func New(data *[]interface{}, Idx ...int) (i *Iterator) {
|
||
//迭代器下标
|
||
var idx int
|
||
if len(Idx) <= 0 {
|
||
//没有传入下标,则将下标设为0
|
||
idx = 0
|
||
} else {
|
||
//有传入下标,则将传入下标第一个设为迭代器下标
|
||
idx = Idx[0]
|
||
}
|
||
if len((*data)) > 0 {
|
||
//如果元素集合非空,则判断下标是否超过元素集合范围
|
||
if idx >= len((*data)) {
|
||
//如果传入下标超过元素集合范围则寻找最近的下标值
|
||
idx = len((*data)) - 1
|
||
}
|
||
} else {
|
||
//如果元素集合为空则将下标设为-1
|
||
idx = -1
|
||
}
|
||
//新建并返回迭代器
|
||
return &Iterator{
|
||
data: data,
|
||
index: idx,
|
||
}
|
||
}
|
||
|
||
//@title Begin
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 如果迭代器为空,直接结束
|
||
// 如果该迭代器元素集合为空,则将下标设为-1
|
||
// 如果该迭代器元素集合不为空,则将下标设为0
|
||
// 随后返回新迭代器指针
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param nil
|
||
//@return I *Iterator 修改后的新迭代器指针
|
||
func (i *Iterator) Begin() (I *Iterator) {
|
||
if i == nil {
|
||
//迭代器为空,直接结束
|
||
return nil
|
||
}
|
||
if len((*i.data)) == 0 {
|
||
//迭代器元素集合为空,下标设为-1
|
||
i.index = -1
|
||
} else {
|
||
//迭代器元素集合非空,下标设为0
|
||
i.index = 0
|
||
}
|
||
//返回修改后的新指针
|
||
return &Iterator{
|
||
data: i.data,
|
||
index: i.index,
|
||
}
|
||
}
|
||
|
||
//@title End
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 如果迭代器为空,直接结束
|
||
// 如果该迭代器元素集合为空,则将下标设为-1
|
||
// 如果该迭代器元素集合不为空,则将下标设为元素集合的最后一个元素的下标
|
||
// 随后返回新迭代器指针
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param nil
|
||
//@return I *Iterator 修改后的新迭代器指针
|
||
func (i *Iterator) End() (I *Iterator) {
|
||
if i == nil {
|
||
//迭代器为空,直接返回
|
||
return nil
|
||
}
|
||
if len((*i.data)) == 0 {
|
||
//元素集合为空,下标设为-1
|
||
i.index = -1
|
||
} else {
|
||
//元素集合非空,下标设为最后一个元素的下标
|
||
i.index = len((*i.data)) - 1
|
||
}
|
||
//返回修改后的该指针
|
||
return &Iterator{
|
||
data: i.data,
|
||
index: i.index,
|
||
}
|
||
}
|
||
|
||
//@title Get
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 如果迭代器为空,直接结束
|
||
// 如果该迭代器元素集合为空,则将下标设为-1
|
||
// 如果该迭代器元素集合不为空,则将下标设为传入的预设下标
|
||
// 如果预设下标超过元素集合范围,则将下标设为最近元素的下标
|
||
// 随后返回该迭代器指针
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param idx int 预设下标
|
||
//@return I *Iterator 修改后的该迭代器指针
|
||
func (i *Iterator) Get(idx int) (I *Iterator) {
|
||
if i == nil {
|
||
//迭代器为空,直接返回
|
||
return nil
|
||
}
|
||
if idx <= 0 {
|
||
//预设下标超过元素集合范围,将下标设为最近元素的下标,此状态下为首元素下标
|
||
idx = 0
|
||
} else if idx >= len((*i.data))-1 {
|
||
//预设下标超过元素集合范围,将下标设为最近元素的下标,此状态下为尾元素下标
|
||
idx = len((*i.data)) - 1
|
||
}
|
||
if len((*i.data)) > 0 {
|
||
//元素集合非空,迭代器下标设为预设下标
|
||
i.index = idx
|
||
} else {
|
||
//元素集合为空,迭代器下标设为-1
|
||
i.index = -1
|
||
}
|
||
//返回修改后的迭代器指针
|
||
return i
|
||
}
|
||
|
||
//@title Value
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 返回迭代器当前下标所指元素
|
||
// 若迭代器为nil或元素集合为空,返回nil
|
||
// 否则返回迭代器当前下标所指向的元素
|
||
// 如果该下标超过元素集合范围,则返回距离最近的元素
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param nil
|
||
//@return e interface{} 迭代器下标所指元素
|
||
func (i *Iterator) Value() (e interface{}) {
|
||
if i == nil {
|
||
//迭代器为nil,返回nil
|
||
return nil
|
||
}
|
||
if len((*i.data)) == 0 {
|
||
//元素集合为空,返回nil
|
||
return nil
|
||
}
|
||
if i.index <= 0 {
|
||
//下标超过元素集合范围下限,最近元素为首元素
|
||
i.index = 0
|
||
}
|
||
if i.index >= len((*i.data)) {
|
||
//下标超过元素集合范围上限,最近元素为尾元素
|
||
i.index = len((*i.data)) - 1
|
||
}
|
||
//返回下标指向元素
|
||
return (*i.data)[i.index]
|
||
}
|
||
|
||
//@title HasNext
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 判断该迭代器是否可以后移
|
||
// 当迭代器为nil时不能后移
|
||
// 当元素集合为空时不能后移
|
||
// 当下标到达元素集合范围上限时不能后移
|
||
// 否则可以后移
|
||
//@author hlccd 2021-07-1
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param nil
|
||
//@return b bool 迭代器下标可以后移?
|
||
func (i *Iterator) HasNext() (b bool) {
|
||
if i == nil {
|
||
//迭代器为nil时不能后移
|
||
return false
|
||
}
|
||
if len((*i.data)) == 0 {
|
||
//元素集合为空时不能后移
|
||
return false
|
||
}
|
||
//下标到达元素集合上限时不能后移,否则可以后移
|
||
return i.index < len((*i.data))
|
||
}
|
||
|
||
//@title Next
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 将迭代器下标后移
|
||
// 当满足后移条件时进行后移同时返回true
|
||
// 当不满足后移条件时将下标设为尾元素下标同时返回false
|
||
// 当迭代器为nil时返回false
|
||
// 当元素集合为空时下标设为-1同时返回false
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param nil
|
||
//@return b bool 迭代器下标后移成功?
|
||
func (i *Iterator) Next() (b bool) {
|
||
if i == nil {
|
||
//迭代器为nil时返回false
|
||
return false
|
||
}
|
||
if i.HasNext() {
|
||
//满足后移条件时进行后移
|
||
i.index++
|
||
return true
|
||
}
|
||
if len((*i.data)) == 0 {
|
||
//元素集合为空时下标设为-1同时返回false
|
||
i.index = -1
|
||
return false
|
||
}
|
||
//不满足后移条件时将下标设为尾元素下标并返回false
|
||
i.index = len((*i.data)) - 1
|
||
return false
|
||
}
|
||
|
||
//@title HasPre
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 判断该迭代器是否可以前移
|
||
// 当迭代器为nil时不能前移
|
||
// 当元素集合为空时不能前移
|
||
// 当下标到达元素集合范围下限时不能前移
|
||
// 否则可以前移
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param nil
|
||
//@return b bool 迭代器下标可以前移?
|
||
func (i *Iterator) HasPre() (b bool) {
|
||
if i == nil {
|
||
//迭代器为nil时不能前移
|
||
return false
|
||
}
|
||
if len((*i.data)) == 0 {
|
||
//元素集合为空时不能前移
|
||
return false
|
||
}
|
||
//下标到达元素集合范围下限时不能前移,否则可以后移
|
||
return i.index >= 0
|
||
}
|
||
|
||
//@title Pre
|
||
//@description
|
||
// 以Iterator迭代器指针做接收者
|
||
// 将迭代器下标前移
|
||
// 当满足前移条件时进行前移同时返回true
|
||
// 当不满足前移条件时将下标设为首元素下标同时返回false
|
||
// 当迭代器为nil时返回false
|
||
// 当元素集合为空时下标设为-1同时返回false
|
||
//@receiver i *Iterator 迭代器指针
|
||
//@param nil
|
||
//@return b bool 迭代器下标前移成功?
|
||
func (i *Iterator) Pre() (b bool) {
|
||
if i == nil {
|
||
//迭代器为nil时返回false
|
||
return false
|
||
}
|
||
if i.HasPre() {
|
||
//满足后移条件时进行前移
|
||
i.index--
|
||
return true
|
||
}
|
||
if len((*i.data)) == 0 {
|
||
//元素集合为空时下标设为-1同时返回false
|
||
i.index = -1
|
||
return false
|
||
}
|
||
//不满足后移条件时将下标设为尾元素下标并返回false
|
||
i.index = 0
|
||
return false
|
||
}
|