我是新来的语言.我希望在根据go语言中的条件迭代列表时从列表中删除元素.例如,我想从列表中删除重复的元素.代码如下.
package main import ( "container/list" "fmt" ) var sMap map[int]bool func main() { l := list.New() l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushFront(6) l.PushFront(5) l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushBack(9) l = removeDuplicate(l) for e := l.Front(); e != nil; e = e.Next() { fmt.Println(e.Value) } } func removeDuplicate(l *list.List) *list.List { sMap = make(map[int]bool) for e := l.Front(); e != nil; e = e.Next() { m := e.Value.(int) fmt.Println("VALUE : ",m) if sMap[m] == true { fmt.Println("Deleting ",e.Value) l.Remove(e) } else { fmt.Println("Adding New Entry",e.Value) sMap[m] = true } } return l }
上面的代码只遍历列表,直到第一次删除.我试图在迭代相同的列表时删除元素.这就是它无法正常工作的原因.有人可以在golang中建议列表迭代器吗?
如果从列表中删除e,那么在下一个循环中调用e.Next()将返回nil.因此,需要在删除e之前将e.Next()分配给下一个.以下是通过迭代清除所有元素的示例(在
list_test.go中)
// Clear all elements by iterating var next *Element for e := l.Front(); e != nil; e = next { next = e.Next() l.Remove(e) }
可以将相同的模式应用于以下问题;
package main import ( "container/list" "fmt" ) var sMap map[int]bool func main() { l := list.New() l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushFront(6) l.PushFront(5) l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushBack(9) l = removeDuplicate(l) for e := l.Front(); e != nil; e = e.Next() { fmt.Println(e.Value) } } func removeDuplicate(l *list.List) *list.List { sMap = make(map[int]bool) var next *list.Element for e := l.Front(); e != nil; e = next { m := e.Value.(int) next = e.Next() fmt.Println("VALUE : ",e.Value) sMap[m] = true } } return l }
产量
VALUE : 7 Adding New Entry 7 VALUE : 5 Adding New Entry 5 VALUE : 4 Adding New Entry 4 VALUE : 5 Deleting 5 VALUE : 6 Adding New Entry 6 VALUE : 7 Deleting 7 VALUE : 5 Deleting 5 VALUE : 4 Deleting 4 VALUE : 9 Adding New Entry 9 7 5 4 6 9