您好,登錄后才能下訂單哦!
Golang 中怎么判斷字符串是否在一個(gè)數(shù)組中,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
在使用 Python 的時(shí)候,如果要判斷一個(gè)字符串是否在另一個(gè)包含字符串的列表中,可以使用in 關(guān)鍵詞,例如:
name_list = ['pm', 'kingname', '青南'] if 'kingname' in name_list: print('kingname 在列表里面')
但是,Golang 是沒有in這個(gè)關(guān)鍵詞的,所以如果要判斷一個(gè)字符串?dāng)?shù)組中是否包含一個(gè)特定的字符串,就需要一個(gè)一個(gè)對(duì)比:
package main import "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{"pm", "kingname", "青南"} target1 := "kingname" target2 := "產(chǎn)品經(jīng)理" result := in(target1, name_list) fmt.Println("kingname 是否在 name_list 中:", result) result = in(target2, name_list) fmt.Println("產(chǎn)品經(jīng)理是否在 name_list 中:", result) }
運(yùn)行效果如下圖所示:
但這種方式有一個(gè)弊端,就是要遍歷整個(gè)字符串?dāng)?shù)組。如果數(shù)組里面有100萬條數(shù)據(jù),那么平均要遍歷50萬次才能找到。這是一個(gè)非常費(fèi)時(shí)間的操作。
有沒有什么辦法可以優(yōu)化這個(gè)操作呢?
如果是有序的整型數(shù)組,那么我們可以使用二分查找,把時(shí)間復(fù)雜度O(n)降到對(duì)數(shù)時(shí)間復(fù)雜度。字符串能不能也這樣操作呢?實(shí)際上是可以的。
在 Golang 中,有一個(gè)排序模塊sort,它里面有一個(gè)sort.Strings()函數(shù),可以對(duì)字符串?dāng)?shù)組進(jìn)行排序。同時(shí),還有一個(gè)sort.SearchStrings()[1]函數(shù),會(huì)用二分法在一個(gè)有序字符串?dāng)?shù)組中尋找特定字符串的索引。
結(jié)合兩個(gè)函數(shù),我們可以實(shí)現(xiàn)一個(gè)更高效的算法:
package main import ( "fmt" "sort" ) func in(target string, str_array []string) bool { sort.Strings(str_array) index := sort.SearchStrings(str_array, target) if index < len(str_array) && str_array[index] == target { return true } return false } func main(){ name_list := []string{"pm", "kingname", "青南"} target1 := "kingname" target2 := "產(chǎn)品經(jīng)理" result := in(target1, name_list) fmt.Println("kingname 是否在 name_list 中:", result) result = in(target2, name_list) fmt.Println("產(chǎn)品經(jīng)理是否在 name_list 中:", result) }
運(yùn)行效果如下圖所示:
其中,sort.Strings是一個(gè) in-place 的修改方式,是直接修改的 str_array。修改以后str_array變成有序的字符串?dāng)?shù)組。接下來通過二分查找快速定位。如果找到了,那么返回目標(biāo)字符串在排序后的列表中第一次出現(xiàn)的索引。如果沒有找到,那么返回?cái)?shù)組中最后一個(gè)元素的索引。所以只要 index 小于最后一個(gè)元素的索引,那么目標(biāo)字符串肯定存在;如果等于最后一個(gè)元素的索引,但是值不等于最后一個(gè)元素,那么目標(biāo)字符串就不存在于字符串?dāng)?shù)組中。
通過先排序再查詢的方式,對(duì)于100萬個(gè)元素的字符串?dāng)?shù)組,只需要查詢20次左右就能確認(rèn)字符串是否存在。速度大大提升。
最后考大家一個(gè)思考題。name_list一開始是亂序的字符串?dāng)?shù)組,在上圖第23行,如果打印一下 name_list,打印出來的是經(jīng)過排序的,還是沒有經(jīng)過排序的字符串?dāng)?shù)字?
關(guān)于 Golang 中怎么判斷字符串是否在一個(gè)數(shù)組中問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。