2014-12-26 98 views
7

我是新来的语言。我希望从列表中删除元素,同时基于go语言中的条件迭代列表。例如,我想从列表中删除重复的元素。代码如下。如何在golang中迭代相同列表时从列表中删除元素

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中提供一个列表迭代器吗?

+0

你的代码段是不完整的,并且不编译。 [如何创建一个最小,完整和可验证的示例。](http://stackoverflow.com/help/mcve) – peterSO

+1

@peterSO - 我添加了完整的代码 – Dany

回答

10

如果从列表中删除e,则在下一个循环中调用e.Next()将返回nil。因此,在删除e之前,需要将e.Next()分配给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 : ", 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 
} 

输出

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 
相关问题