在 Golang 中如何快速判断字符串是否在一个数组中
在使用 Python 的时候,如果要判断一个字符串是否在另一个包含字符串的列表中,可以使用in 关键词,例如:
name_list = ['pm', 'kingname', '青南']
if 'kingname' in name_list:print('kingname 在列表里面')
但是,Golang 是没有in这个关键词的,所以如果要判断一个字符串数组中是否包含一个特定的字符串,就需要一个一个对比:
package mainimport "fmt"func in(target string, str_array []string) bool {for _, element := range str_array{if target == element{return true}}return false
}func main(){name_list := []string{"Go", "Golang", "Gin框架"}target1 := "Gin框架"result := in(target1, name_list)fmt.Println("Gin框架 是否在 name_list 中:", result)
}
但这种方式有一个弊端,就是要遍历整个字符串数组。如果数组里面有100万条数据,那么平均要遍历50万次才能找到。这是一个非常费时间的操作。
有没有什么办法可以优化这个操作呢?
如果是有序的整型数组,那么我们可以使用二分查找,把时间复杂度O(n)降到对数时间复杂度。字符串能不能也这样操作呢?实际上是可以的。
在 Golang 中,有一个排序模块sort,它里面有一个sort.Strings()函数,可以对字符串数组进行排序。同时,还有一个sort.SearchStrings()函数,会用二分法在一个有序字符串数组中寻找特定字符串的索引。
结合两个函数,我们可以实现一个更高效的算法:
package mainimport ("fmt""sort"
)func in(target string, str_array []string) bool {sort.Strings(str_array)index := sort.SearchStrings(str_array, target)//index的取值:[0,len(str_array)]if index < len(str_array) && str_array[index] == target { //需要注意此处的判断,先判断 &&左侧的条件,如果不满足则结束此处判断,不会再进行右侧的判断return true}return false
}func main(){name_list := []string{"Go", "Golang", "Gin框架"}target1 := "Gin框架"result := in(target1, name_list)fmt.Println("Gin框架 是否在 name_list 中:", result)
}
其中,sort.Strings是直接修改的 str_array。修改以后str_array变成有序的字符串数组。接下来通过二分查找快速定位。如果找到了,那么返回目标字符串在排序后的列表中第一次出现的索引。如果没有找到,那么返回数组中最后一个元素的索引。所以只要 index 小于最后一个元素的索引,那么目标字符串肯定存在;如果等于最后一个元素的索引,但是值不等于最后一个元素,那么目标字符串就不存在于字符串数组中。
通过先排序再查询的方式,对于100万个元素的字符串数组,只需要查询20次左右就能确认字符串是否存在。速度大大提升。
在 Golang 中如何快速判断字符串是否在一个数组中相关推荐
- golang 包含 数组_在 Golang 中如何快速判断字符串是否在一个数组中
在使用 Python 的时候,如果要判断一个字符串是否在另一个包含字符串的列表中,可以使用in 关键词,例如: name_list= ['pm', 'kingname', '青南'] if 'king ...
- shell php文件是否存在字符串中,shell 判断字符串是否存在数组中的实现示例
语法格式: [[ "${array[@]}" =~ "字符串" ]] 示例: #!/bin/sh ##数组 array=( address base cart ...
- linux shell 判断字符串是否在数组中
「1」数组初始化 假设数组名为ARR,则初始化的一种方法是: ARR=(2 4 6 8) 其中,括号里的各项使用空格来分隔. 初始化数组的另一种方法是,用其他命令输出的结果来填充到数组中,例如把 ls ...
- js判断字符串是否在数组中
先加一个扩展函数: Array.prototype.contains = function (obj) { var index = this.length; while (index–) { ...
- 判断一个字符串是否在一个数组中
直接代码: static void Main(string[] args){string[] array = { "C#", "Asp.net", " ...
- js 快速找出两个数组中的不同元素或对象
js 快速找出两个数组中的不同元素 var arr1 = [0,1,2,3,4,5]; var arr2 = [0,4,6,1,3,9]; function getArrDifference(arr1 ...
- xlsx表格怎么做汇总统计_Excel表格中如何快速汇总多个数据表中的数据
原标题:Excel表格中如何快速汇总多个数据表中的数据 在Excel工作表中,如果需要汇总报告多个单独单元格的结果,可以将这些单元格中的数据合并到一个主工作表中.这些工作表可以与主工作表在同一个工作簿 ...
- S=S1 S2...Sn是一个长度为N的字符串,存放在一个数组中,编程将S改造之后输出:
S="S1 S2-Sn"是一个长度为N的字符串,存放在一个数组中,编程将S改造之后输出: 将S的所有第偶数个字符按照其原来的下标从大到小的次序放在S的后半部分: 将S的所有第奇数个 ...
- 2021.04.06JAVA定义一个数组,随便输入一个数字,判断这个数在数组中是否存在,存在返回数组的下标,否则返回-1
定义一个数组,随便输入一个数字,判断这个数在数组中是否存在,存在返回数组的下标,否则返回-1 public class TestD {public static void main(String[] ...
最新文章
- C++ typeid操作符
- unity3d 随机生成地形之随机山脉
- OpenCV直线和圆形检测
- 【BIM入门实战】Win11平台上Revit 2018_x64简体中文版图文安装与卸载完整教程
- 测试Rockey 4 Smart加密锁的C语言代码
- r语言 adf检验_r语言中如何进行两组独立样本秩和检验
- Docker 简易搭建 ElasticSearch 集群教程
- 万圣节活动BANNER设计有方案了吗?拿走精品PSD分层模板!
- 线性时间选择算法-《数据结构》(结合例题讲解)
- java 进度条 百分比_java怎么让进度条带百分数
- linux系统开启ssh端口号
- BlockUI对话框
- PLC是怎么工作的?工作原理是什么?
- Vuetify Carouse轮播图 图片切换导致页面总是自动跳转到轮播图位置
- mac打不开txt文件,出现“文本编码“中文 (GB 18030)”不适用。”的解决办法
- python培训浦东
- 如何高效学习英语?这个方法你一定要知道
- web前后端分离开发部署模式
- 数据分析 - 基础原理 之 第三章:数据质量管理 - 第二节:数据生命周期
- Android 源码梳理