mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-01-06 05:01:10 -05:00
74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package intersect
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
)
|
|
|
|
// Simple has complexity: O(n^2)
|
|
func Simple(a interface{}, b interface{}) []interface{} {
|
|
set := make([]interface{}, 0)
|
|
av := reflect.ValueOf(a)
|
|
|
|
for i := 0; i < av.Len(); i++ {
|
|
el := av.Index(i).Interface()
|
|
if contains(b, el) {
|
|
set = append(set, el)
|
|
}
|
|
}
|
|
|
|
return set
|
|
}
|
|
|
|
// Sorted has complexity: O(n * log(n)), a needs to be sorted
|
|
func Sorted(a interface{}, b interface{}) []interface{} {
|
|
set := make([]interface{}, 0)
|
|
av := reflect.ValueOf(a)
|
|
bv := reflect.ValueOf(b)
|
|
|
|
for i := 0; i < av.Len(); i++ {
|
|
el := av.Index(i).Interface()
|
|
idx := sort.Search(bv.Len(), func(i int) bool {
|
|
return bv.Index(i).Interface() == el
|
|
})
|
|
if idx < bv.Len() && bv.Index(idx).Interface() == el {
|
|
set = append(set, el)
|
|
}
|
|
}
|
|
|
|
return set
|
|
}
|
|
|
|
// Hash has complexity: O(n * x) where x is a factor of hash function efficiency (between 1 and 2)
|
|
func Hash(a interface{}, b interface{}) []interface{} {
|
|
set := make([]interface{}, 0)
|
|
hash := make(map[interface{}]bool)
|
|
av := reflect.ValueOf(a)
|
|
bv := reflect.ValueOf(b)
|
|
|
|
for i := 0; i < av.Len(); i++ {
|
|
el := av.Index(i).Interface()
|
|
hash[el] = true
|
|
}
|
|
|
|
for i := 0; i < bv.Len(); i++ {
|
|
el := bv.Index(i).Interface()
|
|
if _, found := hash[el]; found {
|
|
set = append(set, el)
|
|
}
|
|
}
|
|
|
|
return set
|
|
}
|
|
|
|
func contains(a interface{}, e interface{}) bool {
|
|
v := reflect.ValueOf(a)
|
|
|
|
for i := 0; i < v.Len(); i++ {
|
|
if v.Index(i).Interface() == e {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|