-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimplementingHashmap.java
135 lines (123 loc) · 4.22 KB
/
implementingHashmap.java
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package Hashing;
import java.util.*;
public class implementingHashmap {
static class HashMap<K,V>{
private class Node{
K key;
V value;
public Node (K key, V value){//generic
this.key=key;
this.value=value;
}
}
private int n;
private LinkedList<Node> buckets[];
private int N;
@SuppressWarnings("unchecked")
public HashMap(){
this.N=4;
this.buckets=new LinkedList[4];
for(int i=0;i<4;i++){
this.buckets[i]=new LinkedList<>();
}
}
private int hashFunc(K key){
int hc=key.hashCode();
return Math.abs(hc)%N;
}
private int serachInLL(K key, int bi){
LinkedList<Node> ll = buckets[bi];
int di=0;
for(int i=0; i<ll.size();i++){
Node node =ll.get(i);
if(node.key==key){
return di;
}
di++;
}
return -1;
}
@SuppressWarnings("unchecked")
private void rehash(){
ArrayList<Node> oldBuck[]=buckets;
buckets=new LinkedList[N*2];
N=2*N;
for(int i=0;i<buckets.length;i++){
buckets[i]=new LinkedList<>();
}
//node->add in buckets
for(int i=0;i<oldBuck.length;i++){
LinkedList<Node> ll=oldBuck[i];
for(int j=0;j<ll.size();j++){
Node node=ll.remove();
Put(node.key, node.value);
}
}
}
public void Put(K key , V value){
int bi=hashFunc(key);
int di=serachInLL(key, bi);
if(di!=-1){
Node node=buckets[bi].get(di);
node.value=value;
}else{
buckets[bi].add(new Node(key, value));
n++;
}
double lambda=(double)n/N;
if(lambda>2.0){
rehash();
}
}
public boolean containsKey(K key){
int bi=hashFunc(key);
int di=serachInLL(key, bi);
if(di!=-1){
return true;
}else{
return false;
}
}
public V get(K key){
int bi=hashFunc(key);
int di=serachInLL(key, bi);
if(di!=-1){
Node node=buckets[bi].get(di);
return node.value;
}else{
return null;
}
}
public V remove(K key){
int bi=hashFunc(key);
int di=serachInLL(key, bi);
if(di!=-1){
Node node=buckets[bi].remove(di);
n--;
return node.value;
}else{
return null;
}
}
public ArrayList<K> keyset(){
ArrayList<K> keys=new ArrayList<>();
for (int i=0;i<buckets.length;i++) {
LinkedList<Node> ll=buckets[i];
for (Node node : ll) {
keys.add(node.key);
}
}
return keys;
}
public boolean isEmpty(){return n==0;}
public static void main(String[] args) {
HashMap<String,Integer>hm=new HashMap<>();
hm.Put("India", 100);
hm.Put("Chaina", 150);
ArrayList<String> keys=hm.keyset();
for (String key : keys) {
System.out.println(key);
}
}
}
}