2014-10-27 109 views
3

我試圖將兩個字符串數組合併爲一個。結果數組應該刪除所有重複元素。減少數組長度

func MergeArrays(str1, str2 []string) []string { 
    c := make([]string, len(str1)+len(str2), cap(str1)+cap(str2)) 
    k := make(map[string]bool) 
    for i, s := range str1 { 
     if _, ok := k[s]; !ok { 
      c[i] = s 
      k[s] = true 
     } 
    } 
    for j, s := range str2 { 
     if _, ok := k[s]; !ok { 
      c[j+len(str1)] = s 
      k[s] = true 
     } 
    } 
    return c 
} 

測試數據

str1 := []string{"a", "b"} 
str2 := []string{"c", "d", "a"} 

輸出: "a", "b", "c", "d" length of the array "5"

我得到我想要的輸出,但數組的長度應該是4,而不是5。我可以理解爲什麼它打印5,但我想輸出數組長度4。 是否有其他方式來合併兩個數組。

回答

2

開始爲零的長度,並添加一個當你追加的元素。例如,

package main 

import "fmt" 

func MergeArrays(a1, a2 []string) []string { 
    m := make([]string, 0, len(a1)+len(a2)) 
    k := make(map[string]bool, len(a1)+len(a2)) 
    for _, aa := range [][]string{a1, a2} { 
     for _, s := range aa { 
      if !k[s] { 
       m = append(m, s) 
       k[s] = true 
      } 
     } 
    } 
    return m 
} 

func main() { 
    a1 := []string{"a", "b"} 
    a2 := []string{"c", "d", "a"} 
    m := MergeArrays(a1, a2) 
    fmt.Println(len(m), m) 
} 

輸出:

4 [a b c d] 
2

他們切片,而不是陣列和here's an example,解決您的使用情況:

package main 

import "fmt" 

func MergeStringSlices(str1, str2 []string) []string { 
    m := make([]string, len(str1), len(str1)+len(str2)) 
    copy(m, str1) 
already_seen: 
    for _, s := range str2 { 
     for _, t := range m { 
      if s == t { 
       continue already_seen 
      } 
     } 
     m = append(m, s) 
    } 
    return m 
} 

func main() { 
    str1 := []string{"a", "b"} 
    str2 := []string{"c", "d", "a"} 
    fmt.Printf("%#v\n", MergeStringSlices(str1, str2)) 
} 
+1

我想這不會工作,如果有所述'str1'陣列中重複的元素。 – 2014-10-28 14:01:13

+1

是的,這不會查找任何分片中的重複內容,只會用於組合兩者時出現的重複內容。 – thwd 2014-10-28 14:14:08