5-10作业问题—添加键值对与delete顺序对结果为什么有影响
# 具体遇到的问题
delete和map添加值 在遍历中先后顺序 对结果 会有影响。很困惑是为什么?
# 报错信息的截图
对于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)
}
}
正在回答
同学你好,看到你的这个问题,问题特别好,咱们一起来学习下:
问题中描述的“对于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的元素。
同学你这个问题特别好,加油~
相似问题
登录后可查看更多问答,登录/注册
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星