描述
Go中没有像Python那样的集合函数,可以很快捷的进行去重操作,但实际应用中常常会遇到需要去重的时候。
切片
场景1:已经存在的一个切片要去掉其中重复的内容。一般使用map来进行辅助,map的键可以存储切片中的元素,值设置为布尔类型。示例代码如下:
func removeDuplicates(slice []int) []int {
//使用map来记录出现过的元素
seen := make(map[int]bool)
//创建一个无重复的元素切片
unique := []int{}
//遍历原始切片
for _,value := range slice{
if _,ok :=seen[value];!ok{
//如果元素没有出现过,就添加到map和新切片中
seen[value]=true
unique = append(unique,value)
}
}
return unique
}
场景2:在进行爬虫操作的时候,用正则表达式获取到的字符串,想要去掉重复的内容。可以通过定义个containers函数进行辅助,如果这个字符串已经在这个数据中则不进行存储。示例代码如下:
func containers(selice []string,target string) bool{
for _,value := range selice{
if value == target{
return true
}
}
return false
}
数组
在Go中处理数组去重有点不同于处理切片,因为数组的大小在声明时就已经固定,无法动态改变。可以通过创建一个新的切片来存放数组中的唯一元素,然后返回这个切片,实际操作和切片差不多,需求注意的就是长度也是数组的一部分。示例代码:
func removeDuplicatesArr(arr [5]int) []int{
seen := make(map[int]bool)
unique := []int{}
for _,value := range arr{
if _,ok := seen[value]; !ok{
seen[value]=true
unique=append(unique,value)
}
}
return unique
}
拓展1:数组/切片中找到重复元素所在的索引。
思路:要找出数组中重复元素的位置,可以利用map来存储每个元素第一次出现的位置,同时检查元素是否已经出现过。如果发现一个元素已经记录在map中,就可以将其位置记录到切片中。
func findDuplicates(arr []int) map[int][]int{
positions := make(map[int][]int)
seen :=make(map[int]int)
for index,value := range arr{
if firstIndex,found := seen[value];found {
//如果元素已经出现过,将其位置添加到positions中
if _,exists := positions[value];exists{
positions[value]=append(positions[value],index)
}else{
positions[value]=[]int{firstIndex,index}
}
}else{
//记录元素第一次出现的位置
seen[value] = index
}
}
return positions
}
在这个示例中,findDuplicates函数接受一个整数数组,并返回一个map,其中键是数组中的重复元素,值是这些元素出现的所有位置的切片。函数首先遍历数组,记录每个元素首次出现的位置。如果元素已经出现过,就更新该元素在positions中的位置列表。
拓展2:找出数组中重复元素并统计其个数。
func countDuplicates(arr []int) map[int]int {
countMap := make(map[int]int)
for _, value := range arr {
// 每遇到一个元素,就在其对应的计数上加1
countMap[value]++
}
// 可选: 移除只出现一次的元素
for key, count := range countMap {
if count == 1 {
delete(countMap, key)
}
}
return countMap
}
评论 (0)