Golang中如何从切片删除重复字符串并让Map包含计数?部分实现求指导
Golang中如何从切片删除重复字符串并让Map包含计数?部分实现求指导 我正在尝试解决一个问题:给定一个字符串数组,其中某些值会重复多次,也包含只出现一次的值。任务是创建一个包含所有值但每个值只出现一次的集合。我尝试添加一个功能:用数组值作为map的键,对应的值是该键出现的次数。目前第一部分已经完成:
package main
import "fmt"
func main() {
s := []string{"one", "two", "three", "four", "four", "one", "four", "four", "five", "six", "seven", "one", "seven"}
fmt.Printf("Original slice s:%v\n", s)
makeMap := make(map[string]int)
for _, value := range s {
makeMap[value] = 0
}
fmt.Printf("duplicate values removed: %v\n", makeMap)
输出结果:
pritesh@debian:~/go/src/github.com/pritesh-ugrankar/remdup$ go run main.go
Original slice s:[one two three four four one four four five six seven one seven]
duplicate values removed: map[five:0 four:0 one:0 seven:0 six:0 three:0 two:0]
pritesh@debian:~/go/src/github.com/pritesh-ugrankar/remdup$
但我无法实现计数的功能。 我尝试了这种方法:
for _, value := range s {
counter := 0
if _, ok := makeMap[value]; ok {
counter++
}
makeMap[value] = counter
但这并不奏效,这是合理的,因为map只能包含一个值,所以当它遇到另一个值时,会删除前一个值并"覆盖"它。
然后我尝试在第一个循环内添加另一个for key, _ := range makeMap循环,并在其中检查键是否再次出现,但由于这个循环嵌套在第一个循环内,我得到了错误的值。
那么,我应该如何正确获取计数呢?还是说我尝试的方法从根本上就无法解决这个问题?
更多关于Golang中如何从切片删除重复字符串并让Map包含计数?部分实现求指导的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好Yamil, 非常感谢。我从你的回答中学到了很多。
更多关于Golang中如何从切片删除重复字符串并让Map包含计数?部分实现求指导的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
添加一个函数,用于返回切片中某个元素出现的次数
func count(s []string, item string) int {
count := 0
for _, value := range s {
if value == item {
count++
}
}
return count
}
要填充映射中的■■■■部分,
for _, value := range s {
makeMap[value] = count(s, value)
}
现在你只需要提取那些计数为1的元素。
func removeDuplicates(m map[string]int, s []string) []string {
result := make([]string, 0)
for key, value := range m {
if value == 1 {
result = append(result, key)
}
}
return result
}
希望对你有帮助
您的问题在于当前代码中每次迭代都将计数器重置为0,并且没有正确累积计数。要实现计数功能,您需要将每个字符串的出现次数累加到map中。以下是修正后的代码:
package main
import "fmt"
func main() {
s := []string{"one", "two", "three", "four", "four", "one", "four", "four", "five", "six", "seven", "one", "seven"}
fmt.Printf("Original slice s:%v\n", s)
makeMap := make(map[string]int)
// 计算每个字符串的出现次数
for _, value := range s {
makeMap[value]++
}
fmt.Printf("String counts: %v\n", makeMap)
// 创建去重后的切片
uniqueSlice := make([]string, 0, len(makeMap))
for key := range makeMap {
uniqueSlice = append(uniqueSlice, key)
}
fmt.Printf("Duplicate values removed: %v\n", uniqueSlice)
}
输出结果:
Original slice s:[one two three four four one four four five six seven one seven]
String counts: map[five:1 four:4 one:3 seven:2 six:1 three:1 two:1]
Duplicate values removed: [one two three four five six seven]
关键修改:
- 使用
makeMap[value]++直接递增计数,这是Go中map计数的标准做法 - 当键不存在时,
makeMap[value]会返回零值0,然后递增为1 - 单独创建去重后的切片,通过遍历map的键来实现
这样您就同时获得了:
- 包含计数的map:
map[string]int - 去重后的字符串切片:
[]string

