如何使用go获取切片中的单个项目计数?
例如,这是一个切片:如何使用go获取切片中的单个项目计数?,go,Go,例如,这是一个切片: [1, 2, 3, 3, 4] 要获取单个数据1、2、4的计数并返回count=3 也许删除重复的项目(包括它本身)是一个想法,但没有找到合适的方法 我尝试的是: func removeDuplicateItems() { intSlice := []int{1, 2, 3, 3, 4} fmt.Println(intSlice) keys := make(map[int]bool) list := []int{}
[1, 2, 3, 3, 4]
要获取单个数据1、2、4
的计数并返回count=3
也许删除重复的项目(包括它本身)是一个想法,但没有找到合适的方法
我尝试的是:
func removeDuplicateItems() {
intSlice := []int{1, 2, 3, 3, 4}
fmt.Println(intSlice)
keys := make(map[int]bool)
list := []int{}
for _, entry := range intSlice {
if _, value := keys[entry]; !value {
keys[entry] = true
list = append(list, entry)
}
}
fmt.Println(list)
}
得到
我认为获得唯一值计数的一种非常简单快捷的方法是使用映射:
data := map[int]bool{}
cnt := 0 // count of unique values
for _, i := range intSlice {
if dup, ok := data[i]; !ok {
// we haven't seen value i before, assume it's unique
data[i] = false // add to map, mark as non-duplicate
cnt++ // increment unique count
} else if !dup {
// we have seen value i before, but this is only the second time
cnt-- // unique count goes down here
data[i] = true // mark this value as known duplicate
}
}
在这个循环结束时,您将拥有具有唯一值计数的
cnt
,并且您可以对具有值false
的所有键迭代mapdata
,以获得在切片中找到的唯一值。所有组合键基本上都是切片中的值,已消除重复。我只是稍微更改了您的函数:
func removeDuplicateItems() {
intSlice := []int{1, 2, 3, 3, 4}
fmt.Println(intSlice)
keys := make(map[int]int)
list := []int{}
for _, entry := range intSlice {
keys[entry]++
}
for k, v := range keys {
if v == 1 {
list = append(list, k)
}
}
fmt.Println(list)
}
此时列表未排序。如果您想在之后对列表进行排序,您需要使用
sort
软件包。您尝试了什么?包括你的代码。你需要帮助解决什么具体问题?@Flimzy我添加了我尝试过的内容。你期望1,2,4。为什么您的列表中没有3个?@apxp我不想要3
,但想要单个项目。我会更改地图定义。不要只检查bool
将其设置为int
,并计算值在切片中的频率。感谢您的回答。但是我要一个计数。不包括重复数据本身。
func removeDuplicateItems() {
intSlice := []int{1, 2, 3, 3, 4}
fmt.Println(intSlice)
keys := make(map[int]int)
list := []int{}
for _, entry := range intSlice {
keys[entry]++
}
for k, v := range keys {
if v == 1 {
list = append(list, k)
}
}
fmt.Println(list)
}