尝试在Go中实现Java Guava sets.difference

时间:2018-09-27 13:40:54

标签: java go slice guava

Java Guava Sets.difference行为:

Known = ["v1","v2"]; Incoming = ["v2","v3","v4"]

incoming = ["v2","v3","v4"]; knownUpdated = ["v2"]

Sets.difference(Known, Incoming) = v1 (To be removed)

Sets.difference(incoming, knownUpdated) = v3,v4 (To be added)

我在Go中尝试的方法具有以下区别:

Output := [v1 v3 v4] (known, Incoming) 

func Difference(slice1 []string, slice2 []string) []string {
    var diff []string

    for i := 0; i < 2; i++ {
        for _, s1 := range slice1 {
            found := false
            for _, s2 := range slice2 {
                if s1 == s2 {
                    found = true
                    break
                }
            }

            if !found {
                diff = append(diff, s1)
            }
        }
        if i == 0 {
            slice1, slice2 = slice2, slice1
        }
    }

    return diff
}

它给出对称差异,但我需要Guava sets.difference的行为。我知道我的功能有问题。来自public static Sets.SetView difference(Set set1, Set set2)的番石榴文档:返回的集合包含set1包含但set2不包含的所有元素

1 个答案:

答案 0 :(得分:2)

最简单明了的解决方案是使用映射的解决方案-如果仅使用键,丢弃值,则它们与许多其他集合实现(FreeRtosQueue查找{{3} },唯一键,无序)。在这一点上,它实际上是微不足道的:

O(1)

*