我想從切片中洗掉切片范圍,例如從“A”到“Z”洗掉“A”、“B”,但我想讓它高效(我不知道為什么在 Go 中但在 Python 中我們可以使用 hashmap )。
下面的代碼是我能得到的最接近的代碼,但我錯過了一些邊緣情況:
func removeString(listOri []string, targetDelete []string) []string {
newitems := []string{}
for i := range listOri {
for j := range targetDelete {
if listOri [i] != targetDelete[j] {
newitems = append(newitems, listOri [i])
}
}
}
return newitems
}
listOriginal := []string{"A", "B", "C", "D"}
listDelete := []string{"A", "B"}
listNew := removeString(listOriginal, listDelete)
result = "A","B","C","C","D","D"
uj5u.com熱心網友回復:
最好(更快)使用地圖來表示要洗掉的專案。如果原始串列中有 N 個事物,而待洗掉串列中有 M 個事物,則您的代碼(一旦修復錯誤)將在 O(NM) 時間內運行,而基于地圖的解決方案將在準時。
這是示例代碼:
package main
import "fmt"
func filter(src []string, del map[string]bool) []string {
var dst []string
for _, s := range src {
if !del[s] {
dst = append(dst, s)
}
}
return dst
}
func main() {
src := []string{"A", "B", "C", "D"}
del := map[string]bool{"A": true, "B": true}
fmt.Println(filter(src, del))
}
如果確實需要將要洗掉的東西作為切片,則應先將切片轉換為地圖。然后代碼是 O(N M) 時間。
uj5u.com熱心網友回復:
您需要做的是檢查原始專案中的每個專案是否存在于要洗掉的專案串列中,如果不存在,則將其添加到結果中:
func removeString(listOri []string, targetDelete []string) []string {
newitems := []string{}
var found bool
for i := range listOri {
found = false
for j := range targetDelete {
if listOri[i] == targetDelete[j] {
found = true
break
}
}
if !found {
newitems = append(newitems, listOri[i])
}
}
return newitems
}
您可能還會發現Go 是否具有類似于 Python 的“if x in”構造?內容豐富。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451017.html
