diff options
| author | mo khan <mo.khan@gmail.com> | 2020-08-03 13:42:14 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-08-03 13:42:14 -0600 |
| commit | 53434ee474a036340afb9f05ad083a6c43d81eac (patch) | |
| tree | c45c500d74999ee93779421a72bbfe379a3437e0 /src/02/04 | |
| parent | 39450f095b679e6ba8ef591ba28b94f5e0bf131a (diff) | |
Write mini hash table in ruby
Diffstat (limited to 'src/02/04')
| -rw-r--r-- | src/02/04/hash.rb | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/02/04/hash.rb b/src/02/04/hash.rb new file mode 100644 index 0000000..91f7a00 --- /dev/null +++ b/src/02/04/hash.rb @@ -0,0 +1,61 @@ +class List + attr_reader :next, :data + + def initialize(data) + @data = data + end + + def add(data) + if self.next + self.next.add(data) + else + @next = self.class.new(data) + end + end + + def search(&block) + return self if block.call(data) + + @next&.search(&block) + end +end + +class MHash + def initialize(size = 13) + @size = size + @buckets = Array.new(size) + end + + def [](key) + bucket = bucket_for(key) + node = @buckets[bucket] + return if node.nil? + + found = node.search do |item| + item[0] == key + end + return found.data[-1] if found + end + + def []=(key, value) + bucket = bucket_for(key) + if @buckets[bucket] + @buckets[bucket].add([key, value]) + else + @buckets[bucket] = List.new([key, value]) + end + end + + private + + def bucket_for(key) + key % @size + end +end + +h = MHash.new +h[8] = 'hello' +h[21] = 'jello' + +puts [8, h[8]].inspect +puts [21, h[21]].inspect |
