2014-12-26 13 views
7

Ich bin neu, um Sprache zu gehen. Ich möchte Elemente aus der Liste entfernen, während ich die Liste basierend auf einer Bedingung in go-Sprache wiederhole. Zum Beispiel möchte ich die doppelten Elemente aus der Liste entfernen. Der Code ist unten angegeben.Wie man ein Element aus der Liste entfernt, während man dieselbe Liste in Golang wiederholt

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 
} 

Der obige Code durchläuft die Liste nur bis zur ersten Entfernung. Ich versuche, das Element zu entfernen, während ich durch dieselbe Liste iteriere. Das ist der Grund, warum es nicht funktioniert. Könnte jemand einen Listen-Iterator in Golang vorschlagen?

+0

Ihr Codefragment ist unvollständig und nicht kompiliert. [Wie man ein minimales, komplettes und überprüfbares Beispiel erstellt.] (Http://stackoverflow.com/help/mcve) – peterSO

+1

@peterSO - Ich habe den kompletten Code hinzugefügt – Dany

Antwort

10

Wenn e aus der Liste entfernt wird, wird der Anruf von e.Next() in der nächsten Schleife zurückgegeben. Daher müssen Sie e.Next() dem next zuweisen, bevor Sie e löschen. Hier ist das Beispiel alle Elemente zu löschen, indem Iterieren (in 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) 
} 

gleiche Muster kann auf die Frage, wie folgend angewandt werden;

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 
} 

Ausgabe

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 
Verwandte Themen