校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > 使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作

使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作

熱門標(biāo)簽:赤峰電銷 官渡電銷外呼管理系統(tǒng)怎么收費(fèi) 400開頭電話怎樣申請(qǐng) 杭州人工智能電銷機(jī)器人費(fèi)用 貴州電話智能外呼系統(tǒng) 江蘇呼叫中心外呼系統(tǒng)有效果嗎 地圖區(qū)域圖標(biāo)注后導(dǎo)出 利用地圖標(biāo)注位置 谷歌美發(fā)店地圖標(biāo)注

最近項(xiàng)目上碰到個(gè)小需求,輸入是兩個(gè)數(shù)組,一個(gè)舊數(shù)組一個(gè)新數(shù)組,要求獲取新數(shù)組相對(duì)舊數(shù)組所有新增和刪除的元素,例如:

輸入:

arr_old: {"1", "2", "4", "5", "7", "9"}

arr_new: {"2", "3", "4", "6", "7"}

返回:

arr_added: {"3", "6"}

arr_deleted: {"1", "5", "9"}

go的標(biāo)準(zhǔn)庫中沒有類似的直接比較的方法,需要自己具體實(shí)現(xiàn),最簡(jiǎn)單的方法當(dāng)然是舊數(shù)組的每個(gè)元素去新數(shù)組,找不到的就是刪除的,然后新數(shù)組的元素再挨個(gè)去舊數(shù)組找一遍,找不到就是新增的,但這個(gè)方法效率實(shí)在太低了。

這里我使用了一種基于集合運(yùn)算的思想,即分別求兩個(gè)數(shù)組的交集和并集,并集減去交集就是所有發(fā)生變化的元素(要么是新增的,要么是刪除的),遍歷這個(gè)集合中的元素去舊數(shù)組中查找,如果在舊數(shù)組中找到,那么就是刪除掉的元素;反之,如果找不到,則一定能在新數(shù)組中找到(用不著真的再去遍歷一次),那么就是新增的元素。

上代碼,這里有個(gè)技巧,就是利用go中map鍵唯一性的特性,用數(shù)組的元素作為map的key,通過map來實(shí)現(xiàn)快速查找。

package main
import (
 "fmt"
)
func main() {
 //fmt.Println("Hello World!")
 src := []string{"1", "2", "4", "5", "7", "9"}
 dest := []string{"2", "3", "4", "6", "7"}
 added, removed := Arrcmp(src, dest)
 fmt.Printf("add: %v\nrem: %v\n", added, removed)
}
func Arrcmp(src []string, dest []string) ([]string, []string) {
 msrc := make(map[string]byte) //按源數(shù)組建索引
 mall := make(map[string]byte) //源+目所有元素建索引
 var set []string //交集
 //1.源數(shù)組建立map
 for _, v := range src {
 msrc[v] = 0
 mall[v] = 0
 }
 //2.目數(shù)組中,存不進(jìn)去,即重復(fù)元素,所有存不進(jìn)去的集合就是并集
 for _, v := range dest {
 l := len(mall)
 mall[v] = 1
 if l != len(mall) { //長(zhǎng)度變化,即可以存
 l = len(mall)
 } else { //存不了,進(jìn)并集
 set = append(set, v)
 }
 }
 //3.遍歷交集,在并集中找,找到就從并集中刪,刪完后就是補(bǔ)集(即并-交=所有變化的元素)
 for _, v := range set {
 delete(mall, v)
 }
 //4.此時(shí),mall是補(bǔ)集,所有元素去源中找,找到就是刪除的,找不到的必定能在目數(shù)組中找到,即新加的
 var added, deleted []string
 for v, _ := range mall {
 _, exist := msrc[v]
 if exist {
 deleted = append(deleted, v)
 } else {
 added = append(added, v)
 }
 }
 return added, deleted
}

運(yùn)行結(jié)果:

add: [6 3]

rem: [1 5 9]

歡迎大家交流效率更高的方法。

補(bǔ)充:go語言教程之淺談數(shù)組和切片的異同

本期的分享我們來講解一下關(guān)于go語言的數(shù)組和切片的概念、用法和區(qū)別。

在go語言的程序開發(fā)過程中,我們避免不了數(shù)組和切片。關(guān)于他們的用法和區(qū)別卻使得有的小伙伴感覺困惑。所以小棧君這里也歸納和總結(jié)了關(guān)于數(shù)組和切片的干貨幫助小伙伴進(jìn)行理解。

數(shù)組的定義

數(shù)組是具有相同唯一類型的一組已編號(hào)且長(zhǎng)度固定的數(shù)據(jù)項(xiàng)序列,這種類型可以是任意的原始類型例如整形、字符串或者自定義類型。

相對(duì)于去聲明 number0, number1, ..., number99 的變量,使用數(shù)組形式 numbers[0], numbers[1] ..., numbers[99] 更加方便且易于擴(kuò)展。

數(shù)組元素可以通過索引(位置)來讀取(或者修改),索引從 0 開始,第一個(gè)元素索引為 0,第二個(gè)索引為 1,以此類推。

總體來講的話數(shù)組就是同一種類型的固定長(zhǎng)度的序列。

在go語言中數(shù)組的定義是很簡(jiǎn)單的。

如圖所示,我們定義了一個(gè)長(zhǎng)度為2的數(shù)組,在數(shù)組定義的過程中,系統(tǒng)已經(jīng)對(duì)這個(gè)數(shù)組進(jìn)行了初始化并分配了空間。所以我們?nèi)绻胍M(jìn)行賦值可以通過數(shù)組名加上下標(biāo)的方式進(jìn)行賦值。但是值得注意的一點(diǎn)是我們并不能進(jìn)行數(shù)組的超長(zhǎng)處理。這一點(diǎn)有別于java的數(shù)組定義,java的定長(zhǎng)數(shù)組添加值后如果對(duì)于超出的值會(huì)有自動(dòng)擴(kuò)容功能。

但是在go語言中并沒有方法來進(jìn)行增刪改查值,只有通過下標(biāo)的方式,所以我們?nèi)绻M(jìn)行了越界處理編譯都會(huì)進(jìn)行報(bào)錯(cuò)。所以才入門的小伙伴們需要注意一下哦。數(shù)組的下標(biāo)在數(shù)組的合法范圍之外就會(huì)出發(fā)訪問越界,會(huì)有panic出現(xiàn)。所以小棧君也是通過了一個(gè)實(shí)例給大家說明一下,因?yàn)榫幾g可能會(huì)不通過,所以我們巧妙的避開編譯器的編譯進(jìn)行數(shù)組的越界操作說明。

當(dāng)然需要值得注意的一點(diǎn)是,數(shù)組的長(zhǎng)度也是數(shù)組類型的一部分,因此var a [2]int 和 var b [3] int 是兩個(gè)不同的類型。

知識(shí)點(diǎn)來了,在go語言中的數(shù)組是屬于值類型傳遞,當(dāng)我們傳遞一個(gè)數(shù)組到一個(gè)方法中,改變副本的值并不會(huì)修改到原本數(shù)組的值。所以得到的數(shù)組還是原來的樣子。

因此如果我們要對(duì)數(shù)組進(jìn)行值的修改的話,就只有進(jìn)行指針操作啦~。

切片的概念

在go語言中數(shù)組中長(zhǎng)度不可以更改,所以在實(shí)際的應(yīng)用環(huán)境中并不是非常實(shí)用,所以Go語言衍生出了一種靈活性強(qiáng)和功能更強(qiáng)大的內(nèi)置類型,即為切片。

與上面所講的數(shù)組相比,切片的長(zhǎng)度是不固定的,并且切片是可以進(jìn)行擴(kuò)容。切片對(duì)象非常小,是因?yàn)樗侵挥?個(gè)字段的數(shù)據(jù)結(jié)構(gòu):一個(gè)是指向底層數(shù)組的指針,一個(gè)是切片的長(zhǎng)度,一個(gè)是切片的容量。這3個(gè)字段,就是Go語言操作底層數(shù)組的元數(shù)據(jù),有了它們,我們就可以任意的操作切片了。

當(dāng)然,切片作為數(shù)組的引用,所以切片屬于是引用類型,各位小伙伴可千萬要記住了哦。在切片的使用過程當(dāng)中,我們可以通過遍歷數(shù)組的方式進(jìn)行對(duì)于切片的遍歷,我們也可以內(nèi)置方法len對(duì)數(shù)組或切片進(jìn)行長(zhǎng)度的計(jì)算。

當(dāng)然我們也可以對(duì)切片的容量進(jìn)行計(jì)算,之前有講過Go語言有豐富的內(nèi)置庫提供給我們使用,所以我們也可以cap內(nèi)置函數(shù)進(jìn)行容量的計(jì)算。多個(gè)切片如果表示同一個(gè)數(shù)組的片段,它們可以共享數(shù)據(jù);因此一個(gè)切片和相關(guān)數(shù)組的其他切片是共享存儲(chǔ)的,相反,不同的數(shù)組總是代表不同的存儲(chǔ)。數(shù)組實(shí)際上是切片的構(gòu)建塊。

上面的例子小棧君分別用數(shù)組和切片進(jìn)行了測(cè)試,我們可以看到數(shù)組的容量一旦確定后就無法進(jìn)行更改,當(dāng)我們的切片進(jìn)行初始化,初始的容量是2,此時(shí)切片的容量和長(zhǎng)度都是2,但是我通過內(nèi)置的append方法進(jìn)行了切片的增加。此時(shí)的切片的容量和長(zhǎng)度都是4。此時(shí)我們并不能確定切片內(nèi)置擴(kuò)容的機(jī)制,但是隱約猜測(cè)是倍增。

言歸正傳,為了測(cè)試一下切片的擴(kuò)容機(jī)制,所以小棧君又進(jìn)行了切片的增加,此時(shí),細(xì)心的小伙伴應(yīng)該發(fā)現(xiàn),這次小棧君一次性增加了兩個(gè)元素在一個(gè)append里面,因?yàn)檫@是append方法是一個(gè)可變長(zhǎng)度的傳值。這也是一個(gè)小知識(shí)點(diǎn)哦。

如果切片的底層數(shù)組,沒有足夠的容量時(shí),就會(huì)新建一個(gè)底層數(shù)組,把原來數(shù)組的值復(fù)制到新底層數(shù)組里,再追加新值,這時(shí)候就不會(huì)影響原來的底層數(shù)組了。

append目前的算法是:容量小于1000個(gè)時(shí),總是成倍的增長(zhǎng),一旦容量超過1000個(gè),增長(zhǎng)因子設(shè)為1.25,也就是說每次會(huì)增加25%的容量。

之后我們發(fā)現(xiàn)切片的容量和長(zhǎng)度發(fā)生了變化,如果說上次容量的擴(kuò)張是4是我們猜測(cè)的倍數(shù)擴(kuò)容方式,那么這次我們就實(shí)錘了他的擴(kuò)容機(jī)制就是倍增。而且在Go語言的容量和長(zhǎng)度不一樣,所以我們也可以得出結(jié)論,就是在 0 = len(arry) = cap(slice)。

在我們聲明好切片后我們可以使用new或是make方法對(duì)切片進(jìn)行初始化,當(dāng)然小棧君也試著嘗試證明切片如果沒有進(jìn)行初始化是會(huì)panic的。結(jié)果并沒有出現(xiàn)。因?yàn)槿绻鹲lice沒有初始化,它僅僅相當(dāng)于一個(gè)nil,長(zhǎng)度和容量都為0,并不會(huì)panic。

小棧君也考慮到可能是因?yàn)闆]有內(nèi)置增加方法或是沒有報(bào)錯(cuò)僅僅只是因?yàn)槲液竺胬脤?duì)Carry數(shù)組的切割進(jìn)行賦值的緣故。所以不甘心又做了一次嘗試,定義好相應(yīng)的切片后直接使用append方法,結(jié)果如下:

我們同樣可以通過上述的例子了解到切片的下標(biāo)是左閉右開區(qū)間,因?yàn)槲覀僣arry數(shù)組的內(nèi)容如上圖所示, 我們最終得到的結(jié)果是IT干貨棧,下標(biāo)來講的話是屬于1。所以我們得到的結(jié)論和事實(shí)是一樣的。對(duì)于切片我們也有很多用法,如下圖所示:

下圖是Python中對(duì)于切片的操作,并且Python中的數(shù)組更為靈活,在后面我為大家分享Python教程的時(shí)候會(huì)詳細(xì)分享哦。

切片的初始化

對(duì)于切片的初始化我們可以make方法和new方法

new(T) 為每個(gè)新的類型T分配一片內(nèi)存,初始化為 0 并且返回類型為*T的內(nèi)存地址:這種方法 返回一個(gè)指向類型為 T,值為 0 的地址的指針,它適用于值類型如數(shù)組和結(jié)構(gòu)體;它相當(dāng)于 T{}。

make(T) 返回一個(gè)類型為 T 的初始值,它只適用于3種內(nèi)建的引用類型:切片、map 和 channel。

拷貝

因?yàn)樵趃o語言的數(shù)組是屬于值傳遞,之前的方法也證實(shí)了這一點(diǎn),在方法傳遞值的時(shí)候系統(tǒng)會(huì)進(jìn)行拷貝一份副本進(jìn)行傳遞,如果需要改變的值的話就需要使用指針。但是在使用切片處理的時(shí)候,因?yàn)榍衅瑢儆谝脗鬟f,所以go語言有內(nèi)置的函數(shù)copy方法進(jìn)行值的拷貝。

上述的一個(gè)例子可以綜合說明幾點(diǎn)問題了,最開始我們定義了一個(gè)切片并且容量是2,內(nèi)容是1和2,我們同樣定義了切片b但是并沒有做初始化處理。直接使用copy操作。使用copy操作的時(shí)候,小棧君也復(fù)制了源碼出來,第一個(gè)是我們的數(shù)據(jù)源,第二個(gè)參數(shù)傳遞我們的目標(biāo)源。直接使用的話我們可以從結(jié)果看出并沒有成功。

所以接下來小棧君又進(jìn)行了初始化操作。這里舉例的目的是提醒各位,在操作切片的時(shí)候沒有初始化就相當(dāng)于nil,最好是進(jìn)行切片的初始化操作。在早期go語言的版本中,沒有初始化切片會(huì)直接報(bào)錯(cuò)。接下來我又進(jìn)行了再一次的復(fù)制操作并且打印出他們的地址和容量、長(zhǎng)度。可以看出進(jìn)行切片的拷貝是不會(huì)進(jìn)行切片的擴(kuò)容處理。而且他們分別指向了不同的地址說明拷貝成功。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 淺談Go語言中字符串和數(shù)組
  • 簡(jiǎn)單談?wù)凣olang中的字符串與字節(jié)數(shù)組
  • go特性之?dāng)?shù)組與切片的問題
  • 詳解go 動(dòng)態(tài)數(shù)組 二維動(dòng)態(tài)數(shù)組
  • go for range遍歷二維數(shù)組的示例

標(biāo)簽:宜春 鷹潭 保定 河池 黔西 泰安 松原 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作》,本文關(guān)鍵詞  使用,語言,實(shí)現(xiàn),查找,兩個(gè),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美亚洲高清一区二区三区不卡| 欧洲一区二区三区在线| 欧美中文字幕亚洲一区二区va在线| 欧美大肚乱孕交hd孕妇| 日本一区二区动态图| 日韩国产精品大片| 日本韩国精品在线| 亚洲激情在线播放| 99久久国产综合精品色伊| 亚洲天堂免费看| 欧美浪妇xxxx高跟鞋交| 日本不卡在线视频| 国产婷婷色一区二区三区| 成人高清在线视频| 亚洲一区二区四区蜜桃| 337p亚洲精品色噜噜狠狠| 三级亚洲高清视频| 久久精品在线观看| 色婷婷精品大视频在线蜜桃视频| 美女一区二区三区在线观看| 日本一区二区免费在线| 日韩视频免费直播| 色婷婷一区二区三区四区| 亚洲资源中文字幕| 国产日韩欧美综合在线| 在线视频综合导航| 国产凹凸在线观看一区二区| 尤物av一区二区| 国产精品无码永久免费888| 在线观看日韩国产| 国产在线乱码一区二区三区| 亚洲黄网站在线观看| 7777精品伊人久久久大香线蕉| 国产精品亚洲午夜一区二区三区 | 在线播放欧美女士性生活| 成人午夜免费av| 激情深爱一区二区| 日本女人一区二区三区| 亚洲成人免费看| 中文字幕精品—区二区四季| 日韩欧美国产电影| 99re在线精品| 一本一道久久a久久精品| 成人精品视频一区二区三区| 国产91精品免费| 国产自产高清不卡| 丝袜脚交一区二区| 日本不卡视频在线观看| 久久精品99国产精品| 美美哒免费高清在线观看视频一区二区| 夜夜精品视频一区二区| 亚洲精品国产一区二区精华液| 国产精品人妖ts系列视频| 国产欧美一区二区三区网站 | 一区二区三区四区不卡在线 | 欧美成人a视频| 自拍偷在线精品自拍偷无码专区| 亚洲欧美国产三级| 日韩在线一区二区| 99re这里都是精品| 精品国产伦一区二区三区免费| 日韩欧美国产综合| 精品国产欧美一区二区| 亚洲不卡在线观看| 成人免费视频一区| 久久精品一区蜜桃臀影院| 成人欧美一区二区三区黑人麻豆| 日韩国产成人精品| 在线观看欧美黄色| 亚洲主播在线观看| 91女神在线视频| 欧美国产日韩一二三区| 国产一区二区三区在线看麻豆| 欧洲一区二区av| 亚洲制服丝袜一区| 欧美日韩在线亚洲一区蜜芽| 一区二区三区四区在线免费观看| 国产91精品免费| 久久亚洲精精品中文字幕早川悠里| 亚洲欧美一区二区三区极速播放 | 91无套直看片红桃| 久久亚洲精品国产精品紫薇| 日本不卡视频一二三区| 国产一区二区三区香蕉| 久久精品夜色噜噜亚洲aⅴ| 福利一区福利二区| 欧美激情综合网| 色欧美片视频在线观看在线视频| 欧美韩国一区二区| 国产在线精品视频| 亚洲色图20p| 久久蜜桃香蕉精品一区二区三区| 看电视剧不卡顿的网站| 国产日产欧产精品推荐色 | 亚洲码国产岛国毛片在线| 欧美视频中文一区二区三区在线观看| 天堂成人国产精品一区| 亚洲午夜一区二区| 亚洲色图在线看| 国产亚洲1区2区3区| 欧美一级二级在线观看| 成人激情免费电影网址| 国产精品亚洲综合一区在线观看| 日本在线不卡视频| 免费人成黄页网站在线一区二区| 一区二区三区丝袜| 亚洲h在线观看| 一区二区三区影院| 亚洲成人一区二区在线观看| 亚洲va中文字幕| 日韩精品欧美成人高清一区二区| 日韩国产精品久久久久久亚洲| 亚洲一区免费在线观看| 亚洲va在线va天堂| 国产中文字幕精品| 国产在线一区二区综合免费视频| 国产在线精品一区二区不卡了| 精品在线视频一区| 蜜桃av一区二区在线观看| 国产成人福利片| 91丨porny丨首页| 日韩午夜激情视频| 国产精品色哟哟网站| 亚洲一区二区综合| 国产乱子伦视频一区二区三区 | 蜜臀国产一区二区三区在线播放| 麻豆精品在线视频| 91免费观看视频在线| 久久这里都是精品| 青青草91视频| 一本大道久久a久久综合| 国产精品女主播av| 成人精品免费看| 国产日韩精品一区二区三区| 蜜桃av噜噜一区| 国产一二精品视频| 17c精品麻豆一区二区免费| 理论电影国产精品| 日韩经典一区二区| 波波电影院一区二区三区| 欧美一级生活片| 免费人成黄页网站在线一区二区 | 欧美日韩dvd在线观看| 亚洲三级视频在线观看| 国产成人免费视频| 国产精品免费视频一区| 成人av网址在线| 亚洲人成伊人成综合网小说| 91碰在线视频| 偷拍一区二区三区四区| 欧美中文字幕一区| 日韩中文欧美在线| 久久久亚洲国产美女国产盗摄 | 色一区在线观看| 亚洲国产一二三| 欧美精品乱码久久久久久| 伦理电影国产精品| 国产精品日产欧美久久久久| 色av成人天堂桃色av| 热久久国产精品| 亚洲自拍偷拍av| 日韩视频一区二区在线观看| 成人免费视频一区| 亚洲电影在线免费观看| 久久久青草青青国产亚洲免观| 91国偷自产一区二区使用方法| 蜜桃av一区二区在线观看| 中文字幕中文在线不卡住| 精品国产乱码久久久久久浪潮 | 午夜欧美一区二区三区在线播放| 3d动漫精品啪啪| 成人免费视频网站在线观看| 亚洲国产日韩在线一区模特 | 久久精品亚洲精品国产欧美| 97se亚洲国产综合在线| 视频一区视频二区中文字幕| 国产精品日日摸夜夜摸av| 欧美日韩国产一级片| 成人中文字幕在线| 九九九久久久精品| 亚洲成人高清在线| 国产精品久久久久久久久晋中 | 欧美精品一级二级三级| 成人影视亚洲图片在线| 日韩va亚洲va欧美va久久| 国产精品欧美久久久久无广告 | 亚洲成人午夜电影| 亚洲欧洲精品成人久久奇米网| 日韩欧美国产成人一区二区| 一本到高清视频免费精品| 成人久久视频在线观看| 成人av免费在线播放| 韩国视频一区二区| 国精产品一区一区三区mba视频 | 欧美国产日韩a欧美在线观看 | 国产欧美精品区一区二区三区 | 精品日韩一区二区| 日韩欧美一区在线| 欧美va亚洲va香蕉在线| 精品国产sm最大网站免费看|