sort.Search,查找不在切片中的数字

时间:2014-10-23 00:24:55

标签: go

我目前在项目中遇到问题,我必须在切片中找到的数字。我在golang网站上找到了工作代码,效果很好。在我的项目中,我创建一个空块,让else语句完成所有工作。我试图改变代码以删除空块但每次都有错误,我最终找到了一个再现问题的例子:

package main

import (
    "fmt"
    "sort"
)

func main() {
    data := []int{27, 15, 8, 9, 12, 4, 17, 19, 21, 23, 25}
    nr := 9
    sort.Ints(data)
    index := sort.Search(len(data), func(index int) bool { return data[index] == nr })
    if index == len(data) {
        fmt.Print("It's not in : ")
        fmt.Println(nr)
    } else {
        fmt.Print("It's in! Index is at : ")
        fmt.Println(index)
    }
}

golang上的工作代码playground

2 个答案:

答案 0 :(得分:4)

我也遇到同样的问题,因为我误解了godoc sort Search中的文件。

  

如果调用者想要查找23是否在切片中,则必须单独测试数据[i] == 23。

我认为这意味着&#34;文档说= =允许&#34;太。实际上,在sort.Search中作为参数的函数中,只能使用>=<=,而不能使用==。并且该句子意味着在获得索引i之后,您必须使用data[i] == 23对其进行测试,以确保23位于切片中。

答案 1 :(得分:2)

例如,

package main

import (
    "fmt"
    "sort"
)

func main() {
    data := []int{27, 15, 8, 9, 12, 4, 17, 19, 21, 23, 25}
    sort.Ints(data)
    fmt.Println(data)
    x := 9
    notpresent := false
    i := sort.Search(len(data), func(i int) bool { return data[i] >= x })
    if i >= len(data) || data[i] != x {
        // x is not present in data,
        // but i is the index where it would be inserted.
        notpresent = true
    }
    fmt.Println(x, notpresent)
}

输出:

[4 8 9 12 15 17 19 21 23 25 27]
9 false