summaryrefslogtreecommitdiff
path: root/src/02/04/hash.rb
blob: 91f7a003d3db5607237f143f54780f4c48a893f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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