例如,这是一个切片:
[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)
}
知道了
[1 2 3 3 4]
[1 2 3 4]
答案 0 :(得分:1)
我认为获取唯一值计数的一种非常简单快捷的方法是使用地图:
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
的唯一值计数,并且可以为值data
的所有键迭代映射false
以获取您在切片中找到的唯一值。基本上所有组合的键都是切片中的值,已删除重复项。
答案 1 :(得分:1)
我只是稍微更改了您的功能:
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)
}
https://play.golang.org/p/ESFLhC4VC-l
此时,列表未排序。如果要在以后对列表进行排序,则需要使用sort
软件包。