Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove element from list while iterating the same list in golang

I am new to go language. I would like to remove elements from the list while iterating the list based on a condition in go language. For example I want remove the duplicate elements from the list. Code is given below.

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
}

The above code iterates through the list only till the first removal. I am trying to remove the element while iterating through the same list. That is the reason why it is not working. Could anyone suggest an list iterator in golang?

like image 866
Dany Avatar asked Dec 26 '14 22:12

Dany


People also ask

How do you remove an element from a list while iterating?

If you want to delete elements from a list while iterating, use a while-loop so you can alter the current index and end index after each deletion.

How do I delete a foreach?

Use unset() function to remove array elements in a foreach loop. The unset() function is an inbuilt function in PHP which is used to unset a specified variable.

How do you remove an element from an array while iterating in Python?

We can delete multiple elements from a list while iterating, but we need to make sure that we are not invalidating the iterator. So either we need to create a copy of the list for iteration and then delete elements from the original list, or we can use the list comprehension or filter() function to do the same.


1 Answers

If e is removed from the list then call of e.Next() in the next loop will return nil. Therefore, need to assign e.Next() to the next before deleting e. Here is the example to clear all elements by iterating (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)
}

Same pattern can be applied to the question as following;

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
}

Output

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
like image 192
Alper Avatar answered Sep 27 '22 17:09

Alper