2014-12-26 22 views
7

Ben dili yeniyim. Listeyi, bir dilde bulunan bir koşula dayalı olarak yinelemek için listeden çıkarmak istiyorum. Örneğin, yinelenen öğeleri listeden kaldırmak istiyorum. Kod aşağıda verilmiştir.Listede aynı listeyi yinelemek için öğe nasıl kaldırılır

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 
} 

Yukarıdaki kod, yalnızca ilk kaldırma işlemine kadar liste boyunca yinelenir. Aynı listede yinelenen elemanı kaldırmaya çalışıyorum. Çalışmamanın nedeni budur. Golang'da bir liste yineleyici önerebilir mi?

+0

Kişisel kod parçası eksik ve derleme yapmaz. [Minimal, Tam ve Doğrulanabilir bir örnek nasıl oluşturulur.] (Http://stackoverflow.com/help/mcve) – peterSO

+1

@peterSO - Tam kodu ekledim – Dany

cevap

10

Listeden e kaldırılır ve sonraki döngüde e.Next() çağrısı nil döndürecektir. Bu nedenle, e'u silmeden önce next'a e.Next() kodunu atamanız gerekir. İşte (list_test.go olarak) yineleme tarafından tüm unsurları temizlemek için örnektir

// Clear all elements by iterating 
var next *Element 
for e := l.Front(); e != nil; e = next { 
    next = e.Next() 
    l.Remove(e) 
} 

aynı desen aşağıdaki şekilde soruya uygulanabilir;

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 
} 

Çıktı

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 
İlgili konular