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

3 回复

你好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]

关键修改:

  1. 使用 makeMap[value]++ 直接递增计数,这是Go中map计数的标准做法
  2. 当键不存在时,makeMap[value] 会返回零值0,然后递增为1
  3. 单独创建去重后的切片,通过遍历map的键来实现

这样您就同时获得了:

  • 包含计数的map:map[string]int
  • 去重后的字符串切片:[]string
回到顶部