如何使用go获取切片中的单个项目计数?

时间:2019-05-27 10:29:04

标签: 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{}
      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]

2 个答案:

答案 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软件包。