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



我有一个结构切片,每个结构有两个字段。如果仅在第一个字段中存在重复值,则我希望从切片中删除结构。我试过在循环、映射和排序中使用循环,但我搞不清楚。

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

当结构中的所有字段都有相同的值时,网上有很多这样做的例子,但我还没有找到我所描述的情况。

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

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

输出[{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游乐场链接https://play.golang.org/p/x8sNjW_mxrl

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

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

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
}

最新更新