From 1b7f72ee3342db94b3883ecaf7051372f9c81aff Mon Sep 17 00:00:00 2001 From: hlccd <56643462+hlccd@users.noreply.github.com> Date: Tue, 19 Oct 2021 10:18:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=9A=84=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=99=A8=E9=83=A8=E5=88=86,=E5=AE=9E=E7=8E=B0=E4=BA=86?= =?UTF-8?q?=E5=88=A9=E7=94=A8=E8=BF=AD=E4=BB=A3=E5=99=A8=E5=AF=B9=E6=89=80?= =?UTF-8?q?=E8=A6=81=E6=89=BF=E8=BD=BD=E7=9A=84=E5=85=83=E7=B4=A0=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E8=AE=BF=E9=97=AE,=E5=90=8C=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E4=BF=AE=E6=94=B9=E5=85=B6=E5=86=85=E9=83=A8=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- goSTL/utils/iterator/Iterator.go | 293 +++++++++++++++++++++++++++++-- 1 file changed, 282 insertions(+), 11 deletions(-) diff --git a/goSTL/utils/iterator/Iterator.go b/goSTL/utils/iterator/Iterator.go index f0287f4..d3c489c 100644 --- a/goSTL/utils/iterator/Iterator.go +++ b/goSTL/utils/iterator/Iterator.go @@ -14,21 +14,292 @@ package Iterator //当index不小于0时迭代器可前移 //当index小于data的长度时可后移 type Iterator struct { - data *[]interface{} //该迭代器中存放的元素集合的指针 - index int //该迭代器当前指向的元素下标,-1即不存在元素 + data *[]interface{} //该迭代器中存放的元素集合的指针 + index int //该迭代器当前指向的元素下标,-1即不存在元素 } //Iterator迭代器接口 //定义了一套迭代器接口函数 //函数含义详情见下列描述 type Iteratorer interface { - New(data *[]interface{}) (I *Iteratorer) //传输元素创建一个新迭代器 - 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) //将该迭代器前移一位 + 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 }