我正在 Go
sort
包中查看这个函数,并且很好奇是否有一种直接的方法来识别切片中是否存在元素?在 Java Arrays.binarySearch(..) 中,仅返回负值。我很好奇 golang 的 api func SearchInts(a []int, x int) int
是否报告 x 不存在?不确定为什么
func SearchInts(a []int, x int)
不返回两个值 func SearchInts(a []int, x int)
?(index,isPresent)
,i := sort.SearchInts(slice, value)
if i<len(slice) && slice[i]==value {
// It exists
}
函数在排序的整数切片中搜索x并返回Search指定的索引。
SearchInts
您将得到以下输出:
package main
import (
"fmt"
"sort"
)
func main() {
a := []int{1, 2, 3, 4, 6, 7, 8}
x := 2
i := sort.SearchInts(a, x)
fmt.Printf("found %d at index %d in %v\n", x, i, a)
x = 5
i = sort.SearchInts(a, x)
fmt.Printf("%d not found, can be inserted at index %d in %v\n", x, i, a)
}
幸运的是,从 GO 的最新版本 1.21 开始,有一个新的slices
包可用,其中包括 found 2 at index 1 in [1 2 3 4 6 7 8]
5 not found, can be inserted at index 4 in [1 2 3 4 6 7 8]
函数,它的行为与您想要的 Java 类似(通过返回
BinarySearch
如果找到值,请输入)例如bool
根据文档:BinarySearch 在已排序的切片中搜索目标并返回找到目标的位置,或者目标在排序顺序中出现的位置;它还返回一个布尔值,表示是否确实在切片中找到了目标。切片必须按升序排序。
根据您的需要进行一些调整,您可以在评估条件时跳过
package main
import (
"fmt"
"slices"
)
func main() {
names := []string{"Alice", "Bob", "Vera"}
n, found := slices.BinarySearch(names, "Vera")
fmt.Println("Vera:", n, found)
n, found = slices.BinarySearch(names, "Bill")
fmt.Println("Bill:", n, found)
}
Output:
Vera: 2 true
Bill: 1 false
返回值,而只使用
int
值。例如:bool
这将产生以下输出:
package main
import (
"fmt"
"slices"
)
func main() {
names := []string{"Alice", "Bob", "Vera"}
if _, found := slices.BinarySearch(names, "Bob"); found {
fmt.Println("Bob:", found)
}
}
此外,该函数使用泛型下划线,因此它不仅适用于
Output:
Bob: true
类型,还适用于任何其他类型。
最后但并非最不重要的一点是,还有一个int
函数的替代版本,可让您在
BinarySearch
使用自己的比较函数。如果您需要一些自定义比较逻辑,这可能对您也很有用。如果您想深入了解,可以在 https://tip.golang.org/doc/go1.21