2014-12-26 3 views
7

나는 영어가 처음이다. 목록에서 요소를 제거하는 동안 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의 목록 반복자를 제안 할 수 있습니까?

+0

귀하의 코드는 불완전하며 컴파일되지 않습니다. [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve) – peterSO

+1

@peterSO - 전체 코드를 추가했습니다. – Dany

답변

10

e이 목록에서 제거 된 경우 다음 루프에서 e.Next()을 호출하면 nil가 반환됩니다. 따라서 을 을 삭제하기 전에 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