GoLang打印数组中每个值出现的次数

8
下面是我的代码,我需要打印出数组中每个值出现的次数。
package main

import "fmt"

func main(){
    //Initialize an array 
    inputArray := []int{10,20,30,56,67,90,10,20}
    printUniqueValue(inputArray)
}

func printUniqueValue( arr []int){
    //Create a   dictionary of values for each element
    var  dict map[int]int 
    count := 0
    for _ , num :=  range arr {
        dict[num] = count+1
    }
    fmt.Println(dict)
}

但是我无法按照自己的意愿构建字典,例如,dict[10] 应该有值 2。

dict[10] = 2
dict[20] = 2
dict[30] = 1  

我得到的错误是:panic: 尝试在空映射中进行赋值

3个回答

15
package main

import "fmt"

func main(){
    //Initialize an array 
    inputArray := []int{10,20,30,56,67,90,10,20}
    printUniqueValue(inputArray)
}

func printUniqueValue( arr []int){
    //Create a   dictionary of values for each element
    dict:= make(map[int]int)
    for _ , num :=  range arr {
        dict[num] = dict[num]+1
    }
    fmt.Println(dict)
}

这将打印map[67:1 90:1 10:2 20:2 30:1 56:1]


5

你需要使用非空映射初始化 dict;一种方法是使用 var dict = make(map[int]int)

修复后,您还需要处理逻辑错误: dict[num] = count+1 ,其中该值的计数设置为 1 (count 总是 0),而不是前一个值加一。


只是提醒一下:dict 可能与 arr 中的元素顺序不同! - Muzafar Ali
更确切地说,dict 的元素没有顺序。每次迭代它时,你可能会得到不同的顺序。 - andybalholm

1
您有几个问题需要解决:
  1. 您将dict声明为地图值,但它没有被赋任何值,因此为nil
  2. 您没有按照预期更新计数
要解决映射问题,请使用make函数将空映射分配给dict变量。如上所述。
您的期望是:
map[10:2 20:2 30:1 56:1 67:1 90:1]

但即使地图被正确初始化,你仍然会得到:
map[10:1 20:1 30:1 56:1 67:1 90:1]

不要在地图之外使用计数器,而应使用现有的值。
根据Go tour的介绍,当使用不存在的键查询地图时,地图会返回零值。这对于这个任务来说是一个很好的特性,参见下面的代码。
package main

import "fmt"

func main(){
    inputArray := []int{10,20,30,56,67,90,10,20}
    printUniqueValue(inputArray)
}

func printUniqueValue(arr []int) {
    dict := make(map[int]int)
    for _ , num :=  range arr {
        // dict[num] will return 0 if it hasn't yet been initialised
        dict[num] = dict[num] + 1
    }
    fmt.Println(dict)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接