[关闭]
@w1024020103 2017-04-23T17:00:21.000000Z 字数 1168 阅读 1245

Lab 9: Hash Maps

CS61B


IDEA generate hashCode() and equals()

做sanityPutTest()的时候,报错:

java.lang.ArithmeticException: / by zero
at lab9.MyHashMap.hash(MyHashMap.java:125)
at lab9.MyHashMap.put(MyHashMap.java:139)
at lab9tester.TestMyHashMap.sanityPutTest(TestMyHashMap.java:78

看得出来应该是哪里除数为0的情况,但我一直觉得buckets.size()不可以为0.因为这个ArrayList是有一个不为0的initialSize的。

对比了一下参考书给的方法:

9.JPG-71.7kB

发现自己少写了addAll(Collections.ncopies())这个方法,补上之后通过测试:

8.JPG-38.8kB

Collections.ncopies(int n, Object o) Method返回的是一个含有某个特定对象o的n个copy的immutable list.用到这里就是新建了ArrayList之后,在里面全部放入null值,这样return size()就不会为零,因为它是一个装满了initialSize个null值得ArrayList.

参考:
java.util.Collections.ncopies() Method

在做sanityClearTest()测试的时候,发现不通过。Debug看出来原因是我的clear()只是把size变成了0,但buckets这个ArrayList里的元素根本没有变化。因为这个this.size是成员变量,跟ArrayList.size()没有关系。所以我添加了一个在clear()方法里添加把所有ArrayList的元素set为Null值,这样既能保证测试里的get总是返回null,containsKey总是返回false,并且也可以避免ArrayList.size() == 0时导致的除数为0的问题,改进之后测试通过。

11.JPG-34.3kB

不会写keySet(), 后来参考了一下2016 Spring CS61B Data Structures Lab 9 Hash Maps, 发现我烦了一个错误,就是混淆了ArrayList buckets的size和MyHashMap的size.
注意:ArrayList buckets的size()是有多少个桶拿来装这些Entry,而MyHashMap的size是一共有多少个K,V pairs,也就是Entry的个数。
而这里的Entry就像是LinkedList里的每一个Node,它可能有next Node,也可能没有。所以这里的keySet的个数必须是k,v pairs的数目,而不是ArrayList的size.

12.JPG-38kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注