繁体   English   中英

golang将切片{0,1,2,3,4}转换为切片{1,2,3}?

[英]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)
}

这里操场 url https://play.golang.org/p/Vj0Vl5va4LP

要使用从索引切片中检索的索引值创建一个新的数据切片,您必须迭代索引切片并将索引切片的value作为数据切片的index传递。下面是具有此逻辑的代码

package main

import (
    "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)
}

Output:

[0s 1s 2s 3s]
[1 2 3]
[1s 2s 3s]

请注意 - 您的索引切片的类型为[]uint8 - 这很好,但将您限制为最大长度为 256 的切片。这可能是设计使然,但只是需要注意的事情。

这里的其他解决方案使用append - 这对于小切片很好。 但一般来说,在处理切片时,如果您知道最终切片长度,最好预先分配并直接写入索引,并避免append可能执行多次重新分配:

func 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/34vQnNh0jd4

func 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 []string
for index := range ind{
    // you may want to check for index out of range :)
    filteredSlice = append(filteredSlice, sl[index])
}
return filteredSlice

}

如评论所述,您可能需要检查索引是否超出范围!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM