-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdict.rb
More file actions
64 lines (56 loc) · 1.05 KB
/
dict.rb
File metadata and controls
64 lines (56 loc) · 1.05 KB
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
62
module Dict
def Dict.new(num_buckets=256)
aDict=[]
(0...num_buckets).each do |i|
aDict.push([])
end
return aDict
end
def Dict.hash_key(aDict, key)
return key.hash % aDict.length
end
def Dict.get_bucket(aDict, key)
bucket_id=Dict.hash_key(aDict,key)
return aDict[bucket_id]
end
def Dict.get_slot(aDict,key,default=nil)
bucket=Dict.get_bucket(aDict,key)
bucket.each_with_index do |kv,i|
k,v=kv
if key==k
return i,k,v
end
end
return -1,key,default
end
def Dict.get(aDict,key,default=nil)
i,k,v=Dict.get_slot(aDict,key,default)
return v
end
def Dict.set(aDict,key,value)
bucket=Dict.get_bucket(aDict,key)
i,k,v=Dict.get_slot(aDict,key)
if i>=0
bucket[i]=[key,value]
else
bucket.push([key,value])
end
end
def Dict.delete(aDict,key)
bucket=Dict.get_bucket(aDict,key)
(0...bucket.length).each do |i|
k,v =bucket[i]
if key==k
bucket.delete_at(i)
break
end
end
end
def Dict.list(aDict)
aDict.each do |bucket|
if bucket
bucket.each{|k,v| puts k,v}
end
end
end
end