2016-11-23 34 views
0

有兩個字符串類型的切片。我想從golang中的兩個切片找到截集結果。我想找到最佳解決方案而不是迭代每個切片。如何找到golang中兩個截面的截取結果

first_slice := []string{"F8-E7-1E-14-AE-00", "F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E0","84-18-3A-2F-05-E8" } 
second_slice := []string{"F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E8","F8-E7-1E-54-AE-08"} 


Output: 
    result_slice := []string{"F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E8"} 

我已經使用以下方法,但它不是大型數據集的最佳方法。

var result_slice *[]string 

for _, i := range first_slice { 
    for _, x := range second_slice { 
     if i == x { 
      &result_slice.append(i) 
     } 
    } 
} 

如果給我很好的解決方案。

+0

這些是「切片」,而不是陣列! –

+2

將較短切片的字符串填充到映射中作爲O(1)存在查找的關鍵點,並迭代查找附加到結果集的映射中的值的較長切片(如果找到)。需要比您的方法更多的內存。平常的權衡。 – Volker

+1

相關/可能的重複項:[檢查值是否在列表中](http://stackoverflow.com/a/30452518/1705598);和[如何創建一個包含唯一字符串的數組?](http://stackoverflow.com/a/33207265/1705598);和[在Golang中檢查IP地址片段的IP的有效方法](http://stackoverflow.com/a/39249045/1705598);和[在Go Slice或Array中查找唯一項目](http://stackoverflow.com/a/34111576/1705598) – icza

回答

2
firstSlice := []string{"F8-E7-1E-14-AE-00", "F8-E7-1E-14-D0-30", 
    "84-18-3A-2F-05-E0", "84-18-3A-2F-05-E8"} 
secondSlice := []string{"F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E8", 
    "F8-E7-1E-54-AE-08"} 

resultSlice := []string{} 
checkMap := map[string]struct{}{} 

for _, addr := range firstSlice { 
    checkMap[addr] = struct{}{} 
} 
for _, addr := range secondSlice { 
    if _, ok := checkMap[addr]; ok { 
     resultSlice = append(resultSlice, addr) 
    } 
} 

fmt.Println(resultSlice) 

輸出是你想要的。

一個空的結構發生在monery

更重要的是,一定要使用駱駝在golang沒有空間。

+0

如何使用此數據來處理大量數據。是否使用map的原因。 –

+0

@SandunPriyanka時間複雜度是O(n),比你在O(n^2)發佈的時間複雜得多。唯一的問題是它會佔用更多的內存。使用空結構可以節省一些內存 – PapEr

+0

感謝您的幫助。 –