5-10作业问题—添加键值对与delete顺序对结果为什么有影响

5-10作业问题—添加键值对与delete顺序对结果为什么有影响

# 具体遇到的问题
delete和map添加值 在遍历中先后顺序 对结果 会有影响。很困惑是为什么?
# 报错信息的截图
http://img1.sycdn.imooc.com//climg/5faacada09d9da4008740537.jpg

对于map遍历,进行了debug,看到当前位置是0 aas->nnn的数据,先执行添加 nnn->ass,但其添加位置是在2,会参与到这次遍历,后面执行的时候 会再次添加 aas-> nnn而删除 nnn->aas


而如果调换delete和添加的顺序,则添加的键值对会是在当前位置,不参与这次遍历。

但这是为什么呢?


# 尝试过的解决思路和结果
看到有的回答中采用,先delete 后 添加值,试过后知道 结果是对的,但对于原因很迷惑。
# 粘贴全部相关代码,切记添加代码注释(请勿截图)

package main

import "fmt"

func main() {
var myMap MyMap
  myMap = map[interface{}]interface{}{
"aas":"nnn",
     "aaaa":"nbb",
  }
//错误代码,这样操作最后的结果是不对的
myMap.swapKeyValue()
fmt.Println(myMap)
}

type MyMap map[interface{}]interface{}

func (m MyMap) swapKeyValue () {
for key,value := range m {
m[value] = key
delete(m,key)
}
}

正在回答

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

1回答

同学你好,看到你的这个问题,问题特别好,咱们一起来学习下:


问题中描述的“对于map遍历,进行了debug,看到当前位置是0 aas->nnn的数据,先执行添加 nnn->ass,但其添加位置是在2,”原因如下:

//最开始定义了一个map,2个元素
myMap = map[interface{}]interface{}{
"aas":"nnn",
"aaaa":"nbb",
}


原始map有2个元素,那么对应的位置就是0,1,之后再添加位置就应该从2开始了。


问题中描述的“如果调换delete和添加的顺序,则添加的键值对会是在当前位置,不参与这次遍历,看到有的回答中采用,先delete 后 添加值,试过后知道 结果是对的,但对于原因很迷惑。”


原因还是如前面所述的,map中本来就有值的,对其扩充,会在原有的基础上扩充,那如果在扩充之前删除,就是前面同学所提到的先delete,结果是对的,等于重置了map的元素。


同学你这个问题特别好,加油~


  • TOM_QI 提问者 #1
    老师,我们一般认为map是个哈希表的结构,但这里map在遍历时感觉像是一个数组,这是只有在遍历时会这样吗?
    2020-11-11 12:38:54
  • 我是波哥 回复 提问者 TOM_QI #2
    同学你好,你描述的对,咱们map是类似哈希表的结构,在遍历的时候,go语言编译器帮我们屏蔽了底层的细节。 使得我们在遍历的时候可以以类似数组的方式来遍历 。 底层对map的遍历方式类似是这样: // var hiter map_iteration_struct // for mapiterinit(type, range, &hiter); hiter.key != nil; mapiternext(&hiter) { // index_temp = *hiter.key // value_temp = *hiter.val // index = index_temp // value = value_temp // original body // } 底层对数据的遍历方式类似这样: // The loop we generate: // len_temp := len(range) // range_temp := range // for index_temp = 0; index_temp < len_temp; index_temp++ { // value_temp = range_temp[index_temp] // index = index_temp // value = value_temp // original body // } 可以看下这篇文章: https://garbagecollected.org/2017/02/22/go-range-loop-internals/ 加油~
    2020-11-11 13:12:50
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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