4 回答

TA貢獻1909條經驗 獲得超7個贊
要使用從索引切片檢索到的索引值創建新的數據切片,必須迭代索引切片并將索引切片作為數據切片傳遞。下面是具有此邏輯的代碼valueindex
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]

TA貢獻1804條經驗 獲得超2個贊
請注意 - 您的索引切片是類型 - 這很好,但限制為最大長度為256的切片。這可能是設計使然,但只是需要注意的事情。[]uint8
這里使用的其他解決方案 - 這對于小切片來說很好。但一般來說,在處理切片時,如果您知道最終的切片長度,最好預先分配并直接寫入索引,以避免可能執行多次重新分配:appendappend
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

TA貢獻1824條經驗 獲得超8個贊
下面是一個通用解決方案,它僅檢索匹配的元素,如果超出范圍,則丟棄。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
}

TA貢獻1803條經驗 獲得超3個贊
我來到了這個非常簡單的解決方案:
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
}
如前所述,您可能希望檢查索引是否超出范圍!
- 4 回答
- 0 關注
- 108 瀏覽
添加回答
舉報