我有一个结构数组,我想删除所有重复元素但保留数组中的最后一个元素。类似于 hashmap 的东西,我可以将每次匹配的最后一个结构更新到新数组
我有一个像这样的结构
type samplestruct struct {
    value1           string    
    value2           string   
    value3           string   
    value4           string
    value5           string
}
在我的结构数组中,如果任何结构的 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
}
此代码返回与提供的条件匹配的第一个结构,但我想要与条件匹配的最后一个结构
给定输入 -
[
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"}
]
预期产出 -
[
samplestruct{"ram","rahim","india","40","Jamica"},
samplestruct{"amit","rawat","bangladesh","36","india"}
]
问题中的代码几乎就在那里。当在 中找到匹配元素时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
}
根据数据集的大小和幸存元素的数量,其他答案中显示的基于地图的方法可能更合适。这是地图方法的正确实现:
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
}
| 归档时间: | 
 | 
| 查看次数: | 2987 次 | 
| 最近记录: |