考虑以下示例:
package main
import (
"fmt"
"sort"
)
func main() {
var n int
var a sort.IntSlice
a = append(a, 23)
a = append(a, 3)
a = append(a, 10)
sort.Sort(a)
fmt.Println(a)
n = sort.SearchInts(a, 1)
fmt.Println(n)
n = sort.SearchInts(a, 3)
fmt.Println(n)
}
http://play.golang.org/p/wo4r43Zghv
结果是:
[3 10 23]
0
0
当第一个元素和不存在的元素都返回0作为索引时,我怎么知道切片中是否存在数字?
更新 请注意,索引也可以大于切片的长度,因此查找切片中是否存在元素的正确方法是:
num := 1
n = sort.SearchInts(a, num)
if n < len(a) && a[n] == num {
// found
}
答案 0 :(得分:2)
这似乎是一个功能奇怪的功能,但它已记录在案:
例如,给定按升序排序的切片数据,调用 搜索(len(data),func(i int)bool {return data [i]&gt; = 23})返回 最小的索引i使得data [i]> = 23.
还记录了明显的解决方案:
如果来电者想要 找到23是否在切片中,它必须测试数据[i] == 23 分开。
答案 1 :(得分:1)
检查您要查找的号码是否实际存在于返回的索引中。 binary search routines in sort
应该找到可以插入值的索引(如果它尚未存在)。
E.g。在示例will return 3中的切片中搜索100,因为该值必须附加到切片。
调用
Search(len(data), func(i int) bool { return data[i] >= 23 })
返回最小的索引i,使data[i] >= 23
。如果调用者想要查找23是否在切片中,则必须单独测试data[i] == 23
。
答案 2 :(得分:1)
SearchInts
在排序的整数切片中搜索x,并返回搜索指定的索引。 SearchInts
使用函数调用Search
:
func(i int) bool { return a[i] >= x }
从搜索文档引用:
搜索使用二进制搜索来查找并返回[0,n]中f(i)为真的最小索引i,假设在[0,n]范围内, f(i)== true表示f(i + 1)== true。也就是说,搜索需要f 输入范围[0,n]的某些(可能为空)前缀为false 然后对于(可能是空的)余数是真的;搜索返回 第一个真实指数。如果没有这样的索引,则搜索返回n。搜索 仅在[0,n)范围内调用f(i)。
所以基本上你会找回一个索引,你应该插入你搜索过的数字,这样切片就会保持排序。
只需检查返回的索引处的切片中的数字是否与您搜索的数字相同。
答案 3 :(得分:0)
此代码段来自文档:
x := 23
i := sort.Search(len(data), func(i int) bool { return data[i] >= x })
if i < len(data) && data[i] == x {
// x is present at data[i]
} else {
// x is not present in data,
// but i is the index where it would be inserted.
}
http://golang.org/pkg/sort/#Search
所以你必须按照你的建议检查i < len(data) && data[i] == x
。