这个统计单词出现的次数,到底哪里错了 。。为什么每次运行结果都不一样
nl:="how do yu do"
bl:=strings.Split(nl," ")
ml:=bl[:]
var m map[string]int
m=make(map[string]int,20)
for _,v:=range ml{
if len(m) == 0 {
m[v]=1
}else{
for j:=range m{
if j==v{
m[v]++
} else{
m[v]=1
}
}
}
}
fmt.Println(m)
刚试了一下 将
for _,v:=range ml{
m[v]++
}
变简短了就没问题了。可是 上面那个为什么每次运行结果都不一样。。没理解呀
这个哪里不对嘛。。这个运行结果为什么每次都不一样呢
27
收起
正在回答 回答被采纳积分+1
1回答
ccmouse
2021-06-30 19:42:56
首先帮同学格式化了一下:
这段代码逻辑完全不对,我们想要给map中对应的这个元素增加1,我们只需要 m[v]++即可。当然,这里同学可能想判断这个v在不在map里面,这个应该使用:
if count, ok := m[v]; ok {
m[v] = count + 1
} else {
m[v] = 1
}
我们不应该判断m,也就是这个map本身是不是空(15行),也不应该去把map中其他元素的值去改变。(21-23行)
最佳的做法就是同学后面写的,由于m[v]即使不存在,它也会返回0,所以m[v]++一行搞定。
最后回答一下为何每次运行结果不一样,这是因为map的元素是无序的。使用for..range遍历的时候,每个元素出现的顺序是不固定的,同学可以仔细推敲一下,截图的这段程序如果这边range出现的元素顺序不固定,结果就会不固定。同样即使程序修改正确,最后打印的时候每个元素出现的顺序也不固定,但每个单词的计数应该还是对的。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星