How to remove items from a slice while ranging over it?

Viewed 51486

What is the best way to remove items from a slice while ranging over it?

For example:

type MultiDataPoint []*DataPoint

func (m MultiDataPoint) Json() ([]byte, error) {
    for i, d := range m {
        err := d.clean()
        if ( err != nil ) {
            //Remove the DP from m
        }
    }
    return json.Marshal(m)
}
9 Answers

You don't even need to count backwards but you do need to check that you're at the end of the array where the suggested append() will fail. Here's an example of removing duplicate positive integers from a sorted list:

// Remove repeating numbers
numbers := []int{1, 2, 3, 3, 4, 5, 5}
log.Println(numbers)
for i, numbersCount, prevNum := 0, len(numbers), -1; i < numbersCount; numbersCount = len(numbers) {
    if numbers[i] == prevNum {
        if i == numbersCount-1 {
            numbers = numbers[:i]
        } else {
            numbers = append(numbers[:i], numbers[i+1:]...)

        }
        continue
    }
    prevNum = numbers[i]
    i++

}
log.Println(numbers)

Playground: https://play.golang.org/p/v93MgtCQsaN

I just implement a method which removes all nil elements in slice.

And I used it to solve a leetcode problems, it works perfectly.

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
 func removeNil(lists *[]*ListNode) {
    for i := 0; i < len(*lists); i++ {
        if (*lists)[i] == nil {
            *lists = append((*lists)[:i], (*lists)[i+1:]...)
            i--
        }
    }
}

Try Sort and Binary search.

Example:

package main

import (
    "fmt"
    "sort"
)

func main() {
    // Our slice.
    s := []int{3, 7, 2, 9, 4, 5}

    // 1. Iterate over it.
    for i, v := range s {
        func(i, v int) {}(i, v)
    }

    // 2. Sort it. (by whatever condition of yours)
    sort.Slice(s, func(i, j int) bool {
        return s[i] < s[j]
    })

    // 3. Cut it only once.
    i := sort.Search(len(s), func(i int) bool { return s[i] >= 5 })
    s = s[i:]

    // That's it!
    fmt.Println(s) // [5 7 9]
}

https://play.golang.org/p/LnF6o0yMJGT

Related