2017-06-21 74 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) 
} 
相關問題