Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require './doubly_linked_list'
- require 'pry'
- class HashTable < Array
- attr_reader :hash_function
- ListElement = Struct.new(:key, :value)
- class KeyedDoublyLinkedList < DoublyLinkedList
- def initialize(elem)
- super
- end
- def search(k, node = @head)
- if node.nil?
- nil
- elsif node.elem.key == k
- node.elem
- else
- self.search(k, node.right)
- end
- end
- end
- def initialize(size = 100, default = nil)
- super
- @hash_function = Proc.new {|m, k| k % m}
- end
- def add(k, v)
- i = get_slot(k)
- if self[i].nil?
- self[i] = KeyedDoublyLinkedList.new( ListElement.new(k, v) )
- else
- if self[i].search(k).nil?
- self[i].push( ListElement.new(k, v) )
- else
- self[i].search(k).value = v
- end
- end
- end
- ## This is how I would like to call "add" but its not working
- ## Self doesn't update when I reassign the local variable
- # def add(k, v)
- # list = self[get_slot(k)]
- # if list.nil?
- # list = KeyedDoublyLinkedList.new( ListElement.new(k, v) )
- # else
- # node = list.search(k)
- # if node.nil?
- # node.push( ListElement.new(k, v) )
- # else
- # node.value = v
- # end
- # end
- # end
- def contains_key(k)
- i = get_slot(k)
- if self[i].nil?
- false
- else
- if self[i].search(k) then true else false end
- end
- end
- def to_s
- self.select {|p| !p.nil? }.each do |slot|
- slot.to_s
- end
- end
- private
- def get_slot(k)
- @hash_function.call(self.length, k)
- end
- end
- table = HashTable.new(100)
- (1..5).each do |i|
- table.add(i, "test")
- end
- table.add(1, "updated")
- puts table.to_s
- binding.pry
Advertisement
Add Comment
Please, Sign In to add comment