这个统计单词出现的次数,到底哪里错了 。。为什么每次运行结果都不一样

这个统计单词出现的次数,到底哪里错了 。。为什么每次运行结果都不一样

 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]++
}
变简短了就没问题了。可是 上面那个为什么每次运行结果都不一样。。没理解呀

这个哪里不对嘛。。这个运行结果为什么每次都不一样呢

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
ccmouse 2021-06-30 19:42:56

首先帮同学格式化了一下:

http://img1.sycdn.imooc.com//climg/60dc57ab09539faf09440824.jpg

这段代码逻辑完全不对,我们想要给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出现的元素顺序不固定,结果就会不固定。同样即使程序修改正确,最后打印的时候每个元素出现的顺序也不固定,但每个单词的计数应该还是对的。


  • 提问者 慕丝8552178 #1

    理解了, 其中的关键点是map 是无序排列的,, 18行那个循环他并不是 按照顺序来得。。所以会出现每次情况不一样。。谢谢您

    2021-07-01 09:53:23
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师