master
1class List
2 attr_reader :next, :data
3
4 def initialize(data)
5 @data = data
6 end
7
8 def add(data)
9 if self.next
10 self.next.add(data)
11 else
12 @next = self.class.new(data)
13 end
14 end
15
16 def search(&block)
17 return self if block.call(data)
18
19 @next&.search(&block)
20 end
21end
22
23class MHash
24 def initialize(size = 13)
25 @size = size
26 @buckets = Array.new(size)
27 end
28
29 def [](key)
30 bucket = bucket_for(key)
31 node = @buckets[bucket]
32 return if node.nil?
33
34 found = node.search do |item|
35 item[0] == key
36 end
37 return found.data[-1] if found
38 end
39
40 def []=(key, value)
41 bucket = bucket_for(key)
42 if @buckets[bucket]
43 @buckets[bucket].add([key, value])
44 else
45 @buckets[bucket] = List.new([key, value])
46 end
47 end
48
49 private
50
51 def bucket_for(key)
52 key % @size
53 end
54end
55
56h = MHash.new
57h[8] = 'hello'
58h[21] = 'jello'
59
60puts [8, h[8]].inspect
61puts [21, h[21]].inspect