登录
首页 >  Golang >  Go问答

根据多个数组的共同元素创建新数组

来源:stackoverflow

时间:2024-02-29 15:18:23 393浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《根据多个数组的共同元素创建新数组》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我需要从多个数组创建一个数组。新数组必须仅包含传入的所有数组中存在的值。例如。

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"]

该示例应返回 ["fiji", "brasil"],因为它们是所有数组中唯一存在的值。

我怎样才能在 golang 中编写一个可以实现这样目标的函数?

这是我的尝试,但感觉有点笨拙

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
}

演示链接:https://play.golang.org/p/krygw7ovbbn


解决方案


根据我上面的评论,这是使用 go maps 执行此操作的一种方法,从而避免迭代可能较大的切片:

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

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

想法:

  1. 计算每个项目在数组中出现的次数 (arr)。
  2. 如果该数字与 len(arr) 完全相同,则该项目会出现在所有数组中。

以下是员工采用这种方法的示例:

package main

import "fmt"

func uniq(arr []string) []string {
    cache := make(map[string]struct{})
    for _, s := range arr {
        cache[s] = struct{}{}
    }
    var r []string
    for s := range cache {
        r = append(r, s)
    }
    return r
}

func mergeArrays(arrs ...[]string) []string {
    count := make(map[string]int)
    for _, arr := range arrs {
        for _, s := range uniq(arr) {
            count[s]++
        }
    }
    var merged []string
    for s, n := range count {
        if n == len(arrs) {
            merged = append(merged, s)
        }
    }
    return merged
}

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

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

演示链接:https://play.golang.org/p/FB3wJ7-gaIa

编辑:即使每个数组中有重复项,它也会正常工作。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>