赞
踩
package Bag type Bag struct { first *node n int } type node struct { item interface{} next *node } func NewBag() Bag { return Bag{} } func (b Bag) IsEmpty() bool { return b.n == 0 } func (b Bag) Size() int { return b.n } func (b *Bag) Add(item interface{}) { oldfirst := b.first b.first = &node{} b.first.item = item b.first.next = oldfirst b.n++ }
由于go语言没有提供原生的迭代接口支持,所以想使用迭代就需要自己实现,恰巧迭代是背包这个数据结构的重要方法。以下是一个简单的迭代实现:
//导出背包中的全部元素为切片
func (b Bag) Iterator() []interface{} {
s := []interface{}{}
p := b.first
for i := 0; i < b.n; i++ {
s = append(s, p.item)
p = p.next
}
return s
}
这种简单的迭代实现原理是遍历链表,将其中所有的元素都导出为一个切片,然后返回,这样就可以通过go的for range迭代元素。
该方案会在迭代开始时将背包中的所有数据在内存中复制一份,这样做实现起来简单、迭代的速度很快,但是生成切片需要时间并且会占用双倍的内存,不适合数据量较大的情况。
这一版迭代器的设计思路:在背包类中存储一个变量index,用来记录当前迭代到达的位置。
type Bag struct { first *node n int index *node } //省略中间的方法 //初始化迭代器 func (b *Bag) InitIterator() { b.index = b.first } //检查下一个元素 func (b Bag) HasNext() bool { return b.index != nil } //获取下一个元素 func (b *Bag) Next() interface{} { item := b.index.item b.index = b.index.next return item }
下面是测试迭代器的代码:
fun
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。