在使用 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 中如何快速判断字符串是否在一个数组中相关推荐

  1. golang 包含 数组_在 Golang 中如何快速判断字符串是否在一个数组中

    在使用 Python 的时候,如果要判断一个字符串是否在另一个包含字符串的列表中,可以使用in 关键词,例如: name_list= ['pm', 'kingname', '青南'] if 'king ...

  2. shell php文件是否存在字符串中,shell 判断字符串是否存在数组中的实现示例

    语法格式: [[ "${array[@]}" =~ "字符串" ]] 示例: #!/bin/sh ##数组 array=( address base cart ...

  3. linux shell 判断字符串是否在数组中

    「1」数组初始化 假设数组名为ARR,则初始化的一种方法是: ARR=(2 4 6 8) 其中,括号里的各项使用空格来分隔. 初始化数组的另一种方法是,用其他命令输出的结果来填充到数组中,例如把 ls ...

  4. js判断字符串是否在数组中

    先加一个扩展函数:  Array.prototype.contains = function (obj) {  var index = this.length;  while (index–) {  ...

  5. 判断一个字符串是否在一个数组中

    直接代码: static void Main(string[] args){string[] array = { "C#", "Asp.net", " ...

  6. js 快速找出两个数组中的不同元素或对象

    js 快速找出两个数组中的不同元素 var arr1 = [0,1,2,3,4,5]; var arr2 = [0,4,6,1,3,9]; function getArrDifference(arr1 ...

  7. xlsx表格怎么做汇总统计_Excel表格中如何快速汇总多个数据表中的数据

    原标题:Excel表格中如何快速汇总多个数据表中的数据 在Excel工作表中,如果需要汇总报告多个单独单元格的结果,可以将这些单元格中的数据合并到一个主工作表中.这些工作表可以与主工作表在同一个工作簿 ...

  8. S=S1 S2...Sn是一个长度为N的字符串,存放在一个数组中,编程将S改造之后输出:

    S="S1 S2-Sn"是一个长度为N的字符串,存放在一个数组中,编程将S改造之后输出: 将S的所有第偶数个字符按照其原来的下标从大到小的次序放在S的后半部分: 将S的所有第奇数个 ...

  9. 2021.04.06JAVA定义一个数组,随便输入一个数字,判断这个数在数组中是否存在,存在返回数组的下标,否则返回-1

    定义一个数组,随便输入一个数字,判断这个数在数组中是否存在,存在返回数组的下标,否则返回-1 public class TestD {public static void main(String[] ...

最新文章

  1. C++ typeid操作符
  2. unity3d 随机生成地形之随机山脉
  3. OpenCV直线和圆形检测
  4. 【BIM入门实战】Win11平台上Revit 2018_x64简体中文版图文安装与卸载完整教程
  5. 测试Rockey 4 Smart加密锁的C语言代码
  6. r语言 adf检验_r语言中如何进行两组独立样本秩和检验
  7. Docker 简易搭建 ElasticSearch 集群教程
  8. 万圣节活动BANNER设计有方案了吗?拿走精品PSD分层模板!
  9. 线性时间选择算法-《数据结构》(结合例题讲解)
  10. java 进度条 百分比_java怎么让进度条带百分数
  11. linux系统开启ssh端口号
  12. BlockUI对话框
  13. PLC是怎么工作的?工作原理是什么?
  14. Vuetify Carouse轮播图 图片切换导致页面总是自动跳转到轮播图位置
  15. mac打不开txt文件,出现“文本编码“中文 (GB 18030)”不适用。”的解决办法
  16. python培训浦东
  17. 如何高效学习英语?这个方法你一定要知道
  18. web前后端分离开发部署模式
  19. 数据分析 - 基础原理 之 第三章:数据质量管理 - 第二节:数据生命周期
  20. Android 源码梳理

热门文章

  1. js删除字符串最后一个字符方法总汇
  2. stm32毕业设计 火灾报警系统设计与实现 - 单片机 物联网
  3. 【报告分享】2021年中国汽车行业营销研究报告-洞见新消费-艾瑞咨询(附下载)
  4. 0/1背包问题---C++动态规划法
  5. 4套海外精品样机合集,让设计更简单【59】
  6. C#调用扫描仪(keda控件)
  7. Dagger2的简单使用
  8. Latex转换成word
  9. Java学习笔记起始
  10. #Android笔记# 超级足球app 开发总结(一)—— 项目组件化与路由的使用