@@ -5,13 +5,22 @@ def hash_function(key_str, size):
5
5
6
6
############ HashTable class
7
7
class HashTable :
8
- """ Hash table which uses strings for keys. Value can be any object. """
8
+ """ Hash table which uses strings for keys. Value can be any object.
9
+
10
+ Example usage:
11
+
12
+ ht = HashTable(10)
13
+ ht.set('a', 1).set('b', 2).set('c', 3)
14
+ ht['c'] = 30
15
+
16
+ """
9
17
10
18
def __init__ (self , capacity = 1000 ):
11
19
""" Capacity defaults to 1000. """
12
20
13
21
self .capacity = capacity
14
22
self .size = 0
23
+ self ._keys = []
15
24
# Storage format: [ [ [key1, value], [key2, value] ], [ [key3, value] ] ]
16
25
# The outmost list is the one which the hash function maps the index to. The next inner
17
26
# Array is the list of objects in that storage cell. The 3rd level is the individual
@@ -39,6 +48,7 @@ def find_result_func(found_item, hash_table_cell):
39
48
else :
40
49
hash_table_cell .append ([key , obj ])
41
50
self .size += 1
51
+ self ._keys .append (key )
42
52
43
53
self ._find_by_key (key , find_result_func )
44
54
return self
@@ -61,14 +71,33 @@ def remove(self, key):
61
71
def find_result_func (found_item , hash_table_cell ):
62
72
if found_item :
63
73
hash_table_cell .remove (found_item )
74
+ self ._keys .remove (key )
64
75
self .size -= 1
65
76
return found_item [1 ]
66
77
else :
67
78
raise KeyError (key )
68
79
69
80
return self ._find_by_key (key , find_result_func )
70
81
82
+ ####### Python's dict interface
83
+
84
+ def keys (self ):
85
+ return self ._keys
86
+
87
+ def __setitem__ (self , key , value ):
88
+ self .set (key , value )
89
+
90
+ def __getitem__ (self , key ):
91
+ return self .get (key )
92
+
93
+ def __delitem__ (self , key ):
94
+ return self .remove (key )
95
+
96
+ def __repr__ (self ):
97
+ return '{ ' + ', ' .join ([key + ':' + str (self .get (key )) for key in self ._keys ]) + ' }'
98
+
71
99
if __name__ == "__main__" :
100
+ # Run unit tests
72
101
import unittest
73
102
testsuite = unittest .TestLoader ().discover ('test' , pattern = "*hashtable*" )
74
103
unittest .TextTestRunner (verbosity = 1 ).run (testsuite )
0 commit comments