从结构体切片中删除具有重复字段值的结构体

问题描述 投票:0回答:2

我有一个结构体切片,每个结构体有两个字段。如果仅第一个字段中有重复值,我想从切片中删除结构。我尝试过在循环、映射和排序中使用循环,但我无法弄清楚。

我最接近的是,如果两个字段与另一个结构具有相同的值,则从切片中删除一个结构,但如果第一个字段与切片中的另一个结构具有相同的值,我需要删除它。

当结构中的所有字段都具有相同值时,网上有很多执行这些操作的示例,但我没有找到任何适合我所描述的情况的示例。

我正在处理的实际程序要复杂得多,它需要我使用一片结构。

我在下面做了一个简化的示例,它触及了问题的核心。

它输出

[{one 1} {one 2} {five 5}]
所需的输出是
[{one 1} {five 5}]

提前感谢您的帮助。


import "fmt"

type myKey struct {
    key string
    num int
}

type myKeysList []myKey

func remDupKeys(m myKeysList) myKeysList {
    keys := make(map[myKey]bool)
    list := myKeysList{}
    for _, entry := range m {
        if _, value := keys[entry]; !value {
            keys[entry] = true
            list = append(list, entry)
        }
    }
    return list
}
func main() {

    one := myKey{"one", 1}
    two := myKey{"one", 1}
    three := myKey{"one", 2}
    four := myKey{"one", 1}
    five := myKey{"five", 5}

    myKeysList := myKeysList{one, two, three, four, five}
    fmt.Println(myKeysList)
    uList := remDupKeys(myKeysList)
    fmt.Println(uList)
}

Go Playground 链接 https://play.golang.org/p/x8sNjW_mxrl

loops go struct duplicates
2个回答
1
投票

问题中的基本思想是正确的:在地图中记录访问过的值并跳过地图中已有的值。

要删除结构中基于单个字段的重复项,请使用该字段作为映射键:

func remDupKeys(m myKeysList) myKeysList {
    keys := make(map[string]bool)
    list := myKeysList{}
    for _, entry := range m {
        if _, ok := keys[entry.key]; !ok {
            keys[entry.key] = true
            list = append(list, entry)
        }
    }
    return list
}

0
投票

这可能与您正在寻找的类似。

func RemoveDuplicateNestedRepositories(repositories []rp.Repository, nestedRepositories map[string]bool) []string {
    uniqueRepos := []string{}
    for _, repo := range repositories {
        if _, exists := nestedRepositories[repo.Path]; !exists {
            uniqueRepos = append(uniqueRepos, repo.Path)
        }
    }

    return uniqueRepos
}
© www.soinside.com 2019 - 2024. All rights reserved.