比较两个切片

jwe*_*nga 12 comparison go slice

Go中有没有办法比较两个切片并获得切片X中不在切片Y中的元素,反之亦然?

    X := []int{10, 12, 12, 12, 13}
    Y := []int{12, 14, 15}

func compare(X, Y []int)  

calling compare(X, Y)   
    result1 := []int{10, 12, 12, 13} // if you're looking for elements in slice X that are not in slice Y

calling compare(Y, X)
    result2 := []int{14, 15} // if you're looking for elements in slice Y that are not in slice X
Run Code Online (Sandbox Code Playgroud)

Not*_*fer 7

如果顺序不重要且集合很大,则应使用set实现,并使用其diff函数来比较它们.

集合不是标准库的一部分,但您可以使用此库,例如,您可以使用它自动从切片初始化集合.https://github.com/deckarep/golang-set

像这样的东西:

import (
    set "github.com/deckarep/golang-set"
    "fmt"
    )

func main() {
    //note that the set accepts []interface{}
    X := []interface{}{10, 12, 12, 12, 13}
    Y := []interface{}{12, 14, 15}

    Sx := set.NewSetFromSlice(X)
    Sy := set.NewSetFromSlice(Y)
    result1 := Sx.Difference(Sy)
    result2 := Sy.Difference(Sx)

    fmt.Println(result1)
    fmt.Println(result2)
}
Run Code Online (Sandbox Code Playgroud)

  • @jwesonga恕我直言,在这种情况下你不应该出汗 - 使用全套实现的效率并不低,你可以利用你在更重要的东西上实现它的时间 - 就像其他功能一样.或者在SO上辩论的东西;) (3认同)
  • @jwesonga你可以把这个库放在你的源代码树中,为什么要实现另一个呢? (2认同)

ctn*_*ctn 3

像这样的东西应该有效:

package main

import "fmt"

func main() {
    X := []int{10, 12, 12, 12, 13}
    Y := []int{12, 14, 15}

    fmt.Println(compare(X, Y))
    fmt.Println(compare(Y, X))
}

func compare(X, Y []int) []int {
    m := make(map[int]int)

    for _, y := range Y {
        m[y]++
    }

    var ret []int
    for _, x := range X {
        if m[x] > 0 {
            m[x]--
            continue
        }
        ret = append(ret, x)
    }

    return ret
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/4DujR2staI