在切片中搜索字符串时找不到句柄

时间:2016-11-14 18:39:19

标签: go

基于这个基于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 :(得分:3)

二进制搜索需要大于或小于比较,否则它只是对切片进行线性搜索。任何大于请求索引值的比较都需要为true,以便搜索方法向后扫描以查找最小索引。

从排序包中查看字符串搜索功能的默认实现:

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 })
}