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?
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With