go:判断元素是否在切片中

1,115 阅读1分钟

参考网址

blog.csdn.net/K346K346/ar…

问题

如何判断元素是否在切片中,Golang并没有提供直接的库函数来判断,最容易想到的实现便是通过遍历来判断。

遍历查询

以字符串切片为例,判断字符串切片中是否包含某个字符串。
// InSlice 判断字符串item是否在 slice 中
// 该函数需要传入2个参数,第一个是切片,第二个是要判断的字符串
func InSlice(items []string, item string) bool {
    // 循环便利列表items
    // 如果存在,则返回true,如果不存在,则返沪false
    for _, eachItem := range items {
        if eachItem == item {
            return true
        }
    }
    return false
}
// 这种实现时间复杂度是 O(n),n 为切片元素个数。
// 如果切片长度比较短(10以内)或者不是频繁调用,该性能是可以接受的。
// 但是如果切片长度较长且频繁调用,那么这种方法的性能将无法接受,我们可以借助 map 优化一波。

map查询

先将slice转为 map,通过查询 map 来快速查看元素是否在 slice 中。
// ConvertStrSlice2Map 将字符串 slice 转为 map[string]struct{}。
func ConvertStrSlice2Map(sl []string) map[string]struct{} {
    set := make(map[string]struct{}, len(sl))
    for _, v := range sl {
        set[v] = struct{}{}
    }
    return set
}

// InMap判断字符串是否在map对象中。
func InMap(m map[string]struct{}, s string) bool {
	_, ok := m[s]
	return ok
}
// 注意:使用空结构体 `struct{}` 作为 value 的类型,因为 `struct{}` 不占用任何内存空间。
// 虽然将 slice 转为 map 的时间复杂度为 O(n),但是只转换一次可以忽略。
// 查询元素是否在 map 中的时间复杂度为 O(1)。