getNode方法是不是有问题啊 key对应的value本来就是null呢?怎么能直接认为映射中没有这个key-value键值对呢

来源:7-6 基于链表的映射实现

腼腆的老黄

2018-07-09

如题

写回答

3回答

liuyubobobo

2018-07-10

getNode方法中根据key寻找映射中是否存在相应的节点(Node),和value无关。所以不管key-value中的value是否为空,只要key存在,getNode就不会返回空。


get方法确实存在语意歧义的问题,即get返回为空时,有两种可能:1)key存在,但是key对应的value为null;2)key不存在。事实上,我们的设计要求用户在使用get方法之前,应该先用contains方法判断一个key是否存在。即从map中取出一个键对应的值的标准写法应该是:(伪码)

if(map.contains(key))
    value = map.get(key);
else
    // key不存在进行的处理


这个设计和Java标准库的设计是保持一致的。Java语言的映射结构同样存在这样的语意歧义问题。可以进行如下实验:

import java.util.TreeMap;

class Main {
    public static void main(String[] args) {
        
        // 我们测试用的映射使用TreeMap
        TreeMap<Character, Integer> map = new TreeMap<>();
        
        map.put('a', null); // 将‘a’这个key对应的value设为null
        
        System.out.println(map.get('a')); 
        // 打印null, 此时是key对应的value为null
        
        System.out.println(map.get('b'));
        // 打印null, 此时是key不存在
        // 同样返回null, 存在语意歧义
        
        System.out.println(map.containsKey('a'));
        // 打印true,'a'这个key存在
        
        System.out.println(map.containsKey('b'));
        // 打印false,'b'这个key不存在
    }
}


另外,存在一种Map的设计,完全不允许key-value的数据对中,value的值为null。当为一个key所对应的值赋空,意味着删除这个key。如果这样设计映射结构,则不存在get方法返回值语意的歧义性,但是损失了灵活性,key不再能对应null。有兴趣,可以尝试实现一个具备这个假设的映射结构:)


在我们的课程中,设计思路和Jav标准库保持一致:)

2
0

Rabbitism

2018-12-27

估计全世界只有我一个人是用C#上这门课的吧hhh

刚刚看了一下.net core的源代码,getvalue这个操作是用indexer实现的,这样就可以像取下标一样用dict[key]来取值了。.net core中如果key不存在,indexer取值会抛出KeyNotFoundException.

1
1
liuyubobobo
大赞!感谢分享:)继续加油!
2018-12-27
共1条回复

mrglint

2018-07-21

当年没好好读书 好多数学基础都忘光了。。。如何重新拾起啊  波波老师 能推荐一些书吗

0
1
liuyubobobo
数学本身是一个很多子领域的合集。这就像好比问,想学计算机,应该读什么书?其实这个问题太宽泛了。但是在明确自己想学什么数学以后,怎么找合适自己的书籍?可以参考我在公众上的文章《高效学习的秘诀》,可能会有启发。传送门:https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247483836&idx=1&sn=90854aa76507281403e4dd9cd434a12b&chksm=fd8caefacafb27ec78f999fde4f1217c04c6e2ff28cf51fe511d8fa29d484d9281ff91de8c9c&mpshare=1&scene=1&srcid=0722x7fSDKQkHlCnWqxJ8YQh&pass_ticket=8GKAXbgxMUThlGykn6fVR%2FwHECCqNUBaDr6yyw83PVBtz1lnlXATor4F4HguavOZ#rd 加油!
2018-07-22
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程