Saturday 12 January 2019

go - Golang create array from values present in all arrays

Answer


Answer




I need to create an array from multiple arrays. The new array must only contain the values that is present in all arrays passed in. For example.



array1 := []string{"hello", "germany", "brasil", "fiji"}
array2 := []string{"goodbye", "germany", "brasil", "fiji"}
array3 := []string{"hello", "brasil", "fiji"}
array4 := []string{"hello", "brasil", "fiji", "usa"}


func mergeArrays(arrs ...[]string) []string{
// process arrays
}

myNewArray := mergeArrays(array1,array2,array3,array4)
fmt.Println(myNewArray) // ["fiji", "brasil"]


The example should return ["fiji", "brasil"] since they are the only values present in all arrays.




How could I go about writing a function that could achieve such a goal in golang?



This is my attempt but feels a bit clumsy



func mergeArrays(arrs ...[]string) []string {
var finalArr []string
if len(arrs) == 0 {
return finalArr
}


for i, a := range arrs {
if i == 0 {
finalArr = arrs[0]
continue
}
for i, e := range finalArr {
if !strContains(a, e) {
finalArr = append(finalArr[:i], finalArr[i+1:]...)
}
}


}

return finalArr
}

func strContains(s []string, e string) bool {
for _, a := range s {
if a == e {
return true

}
}
return false
}


Playground link: https://play.golang.org/p/KRygw7OVBbn


Answer



Per my comment above, here's one way to do it with go maps and thus avoid iterating over potentially large slices:




func itemize(a []string) map[string]struct{} {
m := make(map[string]struct{})
for _, v:=range a {
m[v] = struct{}{} // struct{}{} == an empty struct (i.e. a value that incurs no storage)
}
return m
}

func commonElements(arrs ...[]string) (results []string) {
if len(arrs) == 0 {

return // edge case
}

mm := itemize(arrs[0]) // master map

for i:=1; i m := itemize(arrs[i]) // current map
for k := range mm {
if _, ok := m[k]; !ok {
delete(mm, k) // master item not in current slice, so remove from master

}
}
}

results = make([]string, len(mm)) // make a precisely sized slice...
i:=0
for k := range mm {
results[i] = k // so we can insert results directly into it without using append
i++
}


return
}


https://play.golang.org/p/pTaXR-nY9zm


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...