我有一个结构数组,我想删除所有重复元素但保留数组中的最后一个元素。类似于 hashmap 的东西,我可以将每次匹配的最后一个结构更新到新数组
我有一个像这样的结构
type samplestruct struct {
value1 string
value2 string
value3 string
value4 string
value5 string
}
Run Code Online (Sandbox Code Playgroud)
在我的结构数组中,如果任何结构的 value1、value2 和 value3 相同,则删除所有重复项并保留最后一个结构。
func unique(sample []samplestruct) []samplestruct {
var unique []samplestruct
for _, v := range sample {
skip := false
for _, u := range unique {
if v.value1 == u.value1 && v.value2 == u.value2 && v.value3 == u.value3 {
skip = true
break
}
}
if !skip {
unique = append(unique, v)
}
}
return unique
}
Run Code Online (Sandbox Code Playgroud)
此代码返回与提供的条件匹配的第一个结构,但我想要与条件匹配的最后一个结构
给定输入 -
[
samplestruct{"ram","rahim","india","34","india"},
samplestruct{"ram","rahim","india","38","America"},
samplestruct{"ram","rahim","india","40","Jamica"},
samplestruct{"amit","rawat","bangladesh","35","hawai"},
samplestruct{"amit","rawat","bangladesh","36","india"}
]
Run Code Online (Sandbox Code Playgroud)
预期产出 -
[
samplestruct{"ram","rahim","india","40","Jamica"},
samplestruct{"amit","rawat","bangladesh","36","india"}
]
Run Code Online (Sandbox Code Playgroud)
问题中的代码几乎就在那里。当在 中找到匹配元素时unique,用当前值覆盖该元素:
func unique(sample []samplestruct) []samplestruct {
var unique []samplestruct
sampleLoop:
for _, v := range sample {
for i, u := range unique {
if v.value1 == u.value1 && v.value2 == u.value2 && v.value3 == u.value3 {
unique[i] = v
continue sampleLoop
}
}
unique = append(unique, v)
}
return unique
}
Run Code Online (Sandbox Code Playgroud)
根据数据集的大小和幸存元素的数量,其他答案中显示的基于地图的方法可能更合适。这是地图方法的正确实现:
func unique(sample []samplestruct) []samplestruct {
var unique []samplestruct
type key struct{ value1, value2, value3 string }
m := make(map[key]int)
for _, v := range sample {
k := key{v.value1, v.value2, v.value3}
if i, ok := m[k]; ok {
// Overwrite previous value per requirement in
// question to keep last matching value.
unique[i] = v
} else {
// Unique key found. Record position and collect
// in result.
m[k] = len(unique)
unique = append(unique, v)
}
}
return unique
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2987 次 |
| 最近记录: |