2017-06-21 45 views
-4


相交我有这样一个数组:
如何找到一个元素在其他阵列

a:= [1,2,3,4,5] 
b:= [5,6,7,8,9] 

如何知道数组b中有包含在阵列中的元素,而无需使用的foreach?

+0

我只是想找到像array_intersect为golang php.net/manual/en/function.array-intersect.php –

+0

的效用函数没有内置的方法,但有一个库提供'set.intersect':https://github.com/deckarep/golang-set。但是,如果您查看实现,则会看到有一个for循环正在运行。 – Akavall

+0

在所有可能的情况下,php效用函数本身使用foreach循环,如果您经常使用,请自己写下函数 – Pita

回答

3

如何知道数组b包含数组a中的元素而不使用foreach?

你不行。而且你不应该尝试,因为这是无意义的限制。

+0

You _could_。你可以使用递归或其他一些复杂的方法不使用for循环。但在代码打高尔夫球之外,你是对的,这个练习毫无意义。 – Flimzy

+0

我只想为golang找到像array_intersect的效用函数 http://php.net/manual/en/function.array-intersect.php –

+1

没有这样的效用函数。 – Volker

1

如果数组排序(因为它们看起来在你的问题中),有一种算法比通过每个元素更好。

选取a的第一个元素,称之为x。 二进制搜索b第一个元素等于或大于x。如果它们相同,则发现两个数组中都包含一个元素,如果不是,请将其作为新的x。现在以相同的方式搜索ax。重复,直到你用尽其中一个数组中的元素。

这可以简单地扩展到任意数量的数组(实际上,使用任意数量的数组写入更容易)。

这里有一个快速和肮脏的实施:

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)) 
} 
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)) 
} 
+0

通过使用set.Intersect:github.com/deckarep/golang-set,代码非常简单。 –

+0

我没有投票,但至少应该指出2个问题。 1)该解决方案使用引擎盖下的循环,2)'array_intersect'通常跟踪非唯一值,'[1,1,2,3]'和'[3,5,1,1] '应该是'[1,1,3]',而你的解决方案会给'[1,3]' – Akavall

0
package main 

import (
    "fmt" 
    "sort" 
) 

func array_intersect(a, b []int) []int { 
    ret := []int{} 

    lenA := len(a) 
    lenB := len(b) 
    if lenA == 0 || lenB == 0 { 
     return ret 
    } 
    sort.Ints(a) 
    sort.Ints(b) 
    var i, j int 
    for { 
     a = a[i:] 
     if i = sort.SearchInts(a, b[j]); i >= len(a) { 
      break 
     } 
     if a[i] == b[j] { 
      ret = append(ret, a[i]) 
     } 
     if j++; j >= lenB { 
      break 
     } 
    } 

    return ret 
} 
func main() { 
    a := []int{5, 7, 1, 1, 2, 3, 4, 5, 7} 
    b := []int{1, 1, 5, 6, 7, 8, 9} 
    fmt.Printf("a=%v, b=%v", a, b) 
    fmt.Printf("%v\n", array_intersect(a, b)) 
    fmt.Printf("a=%v, b=%v", a, b) 
} 
相关问题