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)
如果顺序不重要且集合很大,则应使用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)
像这样的东西应该有效:
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