2016-11-14 34 views
-1

基於此基於sort package的相當簡單的代碼。的o1響應指數是無效的,因爲,因爲一個更大或等於運營商需要二進制搜索由@JimB指出在切片中搜索字符串時找不到句柄

l := []string{"o1", "o2", "o3"} 

i1 := sort.Search(len(l), func(i int) bool { return strings.EqualFold(l[i], "o1") }) 
fmt.Println("o1:", i1) //PRINTS 3 - WRONG 

https://play.golang.org/p/nUs-ozTYsY

工作的解決方案是:

l := []string{"o1", "o2", "o3"} 

i1 := sort.Search(len(l), func(i int) bool { return l[i] >= "o1" }) 
fmt.Println("o1:", i1) 

https://play.golang.org/p/WRsijy_xzV

但是,重要的是要記住重要的上次檢查。 The return value is the index to insert x,這意味着你可以像結束了:

o1: 0 (index 0) 
o2: 1 
o3: 2 
o777: 0 (Same 0 index!) 

通過@JimB如指出,單獨檢查data[i] == 23因此是很重要的。

if i < len(data) && ---> data[i] == x <--- { 
    x is present at data[i] 
} else { 
    ... 
} 
+1

從搜索文檔'搜索使用二進制搜索找到並返回我最小的指數[0, n)在哪個f(i)是真實的。如果要測試項目是否在列表中,則必須單獨檢查。從同一文檔部分的例子:'如果調用者想要查找23是否在切片中,它必須單獨測試數據[i] == 23' – JimB

+0

太棒了!這解釋了if檢查結束時的data [i] == x'。好東西。 – Custodio

回答

3

二分法搜索需要大於或小於比較,否則它只是片上的線性搜索。任何大於所請求索引處的值的比較都必須爲真,以便搜索方法向後掃描以查找最小索引。

請參閱從排序包字符串搜索功能的默認實現:

https://golang.org/src/sort/search.go?s=3673:3717#L91

func SearchStrings(a []string, x string) int { 
    return Search(len(a), func(i int) bool { return a[i] >= x }) 
}