golang 将 slice{0,1,2,3,4} 转换为 slice{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)
}
这是一个通用的解决方案,它只检索匹配的元素,如果超出范围则丢弃。
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
}
要使用从索引切片中检索到的索引值创建新的数据切片,您必须迭代索引切片并将索引切片的 value
作为数据 slice.Below 的 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)
}
输出:
[0s 1s 2s 3s]
[1 2 3]
[1s 2s 3s]
我想到了这个非常简单的解决方案:
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
}
如评论所述,您可能需要检查索引是否超出范围!
请注意 - 您的索引切片的类型为 []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
}
我有动态的字符串片段,例如 {"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/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
}
要使用从索引切片中检索到的索引值创建新的数据切片,您必须迭代索引切片并将索引切片的 value
作为数据 slice.Below 的 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)
}
输出:
[0s 1s 2s 3s]
[1 2 3]
[1s 2s 3s]
我想到了这个非常简单的解决方案:
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
}
如评论所述,您可能需要检查索引是否超出范围!
请注意 - 您的索引切片的类型为 []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
}