Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用go获取切片中的单个项目计数?_Go - Fatal编程技术网

如何使用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
的所有键迭代map
data
,以获得在切片中找到的唯一值。所有组合键基本上都是切片中的值,已消除重复。

我只是稍微更改了您的函数:

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)
}