减少数组长度

时间:2014-10-27 17:10:14

标签: go slice

我试图将两个字符串数组合并为一个。生成的数组应删除所有重复元素。

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 个答案:

答案 0 :(得分: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 :(得分: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]