猿问

golang convert slice{0,1,2,3,4} to slice{1,2,3}?

我有字符串的动态切片,例如{“0s”,“1s”,“2s”,“3s”,“4s”}。

我有动态索引切片,例如{1,2,3}。

所以我只需要切片中索引为1,2和3的元素。

请注意,索引切片和数据切片都是动态的。


package main


import (

    "fmt"

)


func main() {

    indexes := []uint8{1, 2, 3}              //dynamic slice. maybe different elements and count

    data := []string{"0s", "1s", "2s", "3s", } //dynamic slice. maybe different elements and count


    // I need convert data to {"1s", "2s", "3s"} using indexes (dynamic) slice

    fmt.Println(data)

    fmt.Println(indexes)

}

这里 游乐场 网址 https://play.golang.org/p/Vj0Vl5va4LP


慕森卡
浏览 117回答 4
4回答

jeck猫

要使用从索引切片检索到的索引值创建新的数据切片,必须迭代索引切片并将索引切片作为数据切片传递。下面是具有此逻辑的代码valueindexpackage mainimport (    "fmt")func main() {    indexes := []uint8{1, 2, 3}    data := []string{"0s", "1s", "2s", "3s"}    var newData []string    fmt.Println(data)    fmt.Println(indexes)    for _, v2 := range indexes {        newData = append(newData, data[v2])    }    fmt.Println(newData)}输出:[0s 1s 2s 3s][1 2 3][1s 2s 3s]

慕婉清6462132

请注意 - 您的索引切片是类型 - 这很好,但限制为最大长度为256的切片。这可能是设计使然,但只是需要注意的事情。[]uint8这里使用的其他解决方案 - 这对于小切片来说很好。但一般来说,在处理切片时,如果您知道最终的切片长度,最好预先分配并直接写入索引,以避免可能执行多次重新分配:appendappendfunc correlate(vs []string, is []uint8) (s []string) {    s = make([]string, len(is)) // pre-allocate results length - to avoid using append    for j, i := range is {        s[j] = vs[i]    }    return}https://play.golang.org/p/Et2VyoZzo59

有只小跳蛙

下面是一个通用解决方案,它仅检索匹配的元素,如果超出范围,则丢弃。https://play.golang.org/p/34vQnNh0jd4func getElementsByIndexes(data []string, indexes []uint8) []string {    res := make([]string, 0)    l := len(data)        for _, v := range indexes {         // discard if out of range        if int(v) >= l {            continue        }            res = append(res, data[int(v)])    }    return res}

繁星点点滴滴

我来到了这个非常简单的解决方案:func filterByIndexes(sl []string, ind []int)[]string{var filteredSlice []stringfor index := range ind{    // you may want to check for index out of range :)    filteredSlice = append(filteredSlice, sl[index])}return filteredSlice}如前所述,您可能希望检查索引是否超出范围!
随时随地看视频慕课网APP

相关分类

Go
我要回答