我有一个类似的阵列:
a:= [1,2,3,4,5]
b:= [5,6,7,8,9]
如何知道数组b在数组a中包含元素而不使用foreach?
答案 0 :(得分:3)
如何知道数组b在数组a中包含元素而不使用foreach?
你做不到。你不应该尝试,因为这是毫无意义的限制。
答案 1 :(得分:1)
如果对数组进行排序(因为它们似乎在您的问题中),则有一种算法比通过每个元素更好。
选择a
的第一个元素,将其命名为x
。
二进制搜索b
表示第一个元素等于或大于x
。如果它们相等,则发现两个数组中都包含一个元素,如果没有,则将其作为新的x
。现在以同样的方式搜索a
x
。重复,直到其中一个数组中的元素用完为止。
这可以简单地扩展到任意数量的数组(实际上,使用任意数量的数组更容易编写)。
这是一个快速而肮脏的实现:
package main
import (
"fmt"
"sort"
)
func inter(arrs ...[]int) []int {
res := []int{}
x := arrs[0][0]
i := 1
for {
off := sort.SearchInts(arrs[i], x)
if off == len(arrs[i]) {
// we emptied one slice, we're done.
break
}
if arrs[i][off] == x {
i++
if i == len(arrs) {
// x was in all the slices
res = append(res, x)
x++ // search for the next possible x.
i = 0
}
} else {
x = arrs[i][off]
i = 0 // This can be done a bit more optimally.
}
}
return res
}
func main() {
a := []int{1, 2, 3, 4, 5, 7}
b := []int{5, 6, 7, 8, 9}
fmt.Println(inter(a, b))
}
答案 2 :(得分:0)
package main

 import(
 set“github.com/deckarep/golang-set"
)
func array_intersect(a ,b [] interface {})[] interface {} {
 return set.NewSetFromSlice(a).Intersect(set.NewSetFromSlice(b))。ToSlice()
}
 func main(){
 a:= [] interface {} {1,2,3,4,5,7}
 b:= [] interface {} {5,6,7,8,9}

 println(array_intersect(a,b))
}