完成的迭代器部分,实现了利用迭代器对所要承载的元素进行访问,同时不会修改其内部情况

This commit is contained in:
hlccd 2021-10-19 10:18:04 +08:00 committed by GitHub
parent 0dad68e716
commit 1b7f72ee33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -14,21 +14,292 @@ package Iterator
//当index不小于0时迭代器可前移 //当index不小于0时迭代器可前移
//当index小于data的长度时可后移 //当index小于data的长度时可后移
type Iterator struct { type Iterator struct {
data *[]interface{} //该迭代器中存放的元素集合的指针 data *[]interface{} //该迭代器中存放的元素集合的指针
index int //该迭代器当前指向的元素下标,-1即不存在元素 index int //该迭代器当前指向的元素下标,-1即不存在元素
} }
//Iterator迭代器接口 //Iterator迭代器接口
//定义了一套迭代器接口函数 //定义了一套迭代器接口函数
//函数含义详情见下列描述 //函数含义详情见下列描述
type Iteratorer interface { type Iteratorer interface {
New(data *[]interface{}) (I *Iteratorer) //传输元素创建一个新迭代器 Begin() (I *Iterator) //将该迭代器设为位于首节点并返回新迭代器
Begin() (I *Iterator) //将该迭代器设为位于首节点并返回新迭代器 End() (I *Iterator) //将该迭代器设为位于尾节点并返回新迭代器
End() (I *Iterator) //将该迭代器设为位于尾节点并返回新迭代器 Get(idx int) (I *Iterator) //将该迭代器设为位于第idx节点并返回该迭代器
Get(idx int) (I *Iterator) //将该迭代器设为位于第idx节点并返回该迭代器 Value() (e interface{}) //返回该迭代器下标所指元素
Value() (e interface{}) //返回该迭代器下标所指元素 HasNext() (b bool) //判断该迭代器是否可以后移
HasNext() (b bool) //判断该迭代器是否可以后移 Next() (b bool) //将该迭代器后移一位
Next() (b bool) //将该迭代器后移一位 HasPre() (b bool) //判罚该迭代器是否可以前移
HasPre() (b bool) //判罚该迭代器是否可以前移 Pre() (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
} }