-
Notifications
You must be signed in to change notification settings - Fork 0
/
HashTableChain.java
216 lines (186 loc) · 4.79 KB
/
HashTableChain.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* File: HashTableChain.java
* Date: May 01, 2018
* Author: Kitsao Emmanuel
* Purpose: Implement Chaining to store hashed data.
* Uses as keys the last names in the patient.txt
* =======================================================================================
*/
/* Class ChainedHashEntry */
class ChainedHashEntry {
String key;
ChainedHashEntry next;
/* Constructor */
ChainedHashEntry(String key) {
this.key = key;
this.next = null;
}
}
/* Class HashTable */
class HashTable {
private int capacity = 50;
private int size;
private ChainedHashEntry[] hashTable;
/* Constructor */
public HashTable() {
size = 0;
hashTable = new ChainedHashEntry[capacity];
for (int i = 0; i < capacity; i++)
hashTable[i] = null;
}
/* Function to get number of elements */
public int getSize() {
return size;
}
/* Function to clear hash table */
public void empty() {
for (int i = 0; i < capacity; i++)
hashTable[i] = null;
}
/* Function to get value of a key */
public String get(String key) {
int hash = (hash(key) % capacity);
if (hashTable[hash] == null)
return null;
else {
ChainedHashEntry entry = hashTable[hash];
while (entry != null && !entry.key.equals(key))
entry = entry.next;
if (entry == null)
return null;
else
return entry.key;
}
}
/* Function to insert a key */
public void insert(String key) {
int hash = (hash(key) % capacity);
if (hashTable[hash] == null)
hashTable[hash] = new ChainedHashEntry(key);
else {
ChainedHashEntry entry = hashTable[hash];
while (entry.next != null && !entry.key.equals(key))
entry = entry.next;
if (!entry.key.equals(key))
entry.next = new ChainedHashEntry(key);
}
size++;
}
public void remove(String key) {
int hash = (hash(key) % capacity);
if (hashTable[hash] != null) {
ChainedHashEntry prevEntry = null;
ChainedHashEntry entry = hashTable[hash];
while (entry.next != null && !entry.key.equals(key)) {
prevEntry = entry;
entry = entry.next;
}
if (entry.key.equals(key)) {
if (prevEntry == null)
hashTable[hash] = entry.next;
else
prevEntry.next = entry.next;
size--;
}
}
}
/* Function to give a hash value for a given string */
private int hash(String str) {
int hashVal = str.hashCode();
hashVal %= capacity;
if (hashVal < 0)
hashVal += capacity;
return hashVal;
}
/* Function to redo hashing */
public void rehash() throws Exception {
empty();
HashTable temp = new HashTable();
for (int i = 0; i < capacity; i++) { // copy all elements to temp
if (temp.hashTable[i] != null) {
temp.hashTable[i] = hashTable[i];
}
}
capacity = capacity * 2;
for (int i = 0; i < capacity / 2; i++) {
ChainedHashEntry entry = hashTable[i];
if (entry != null) {
insert(entry.key);
}
}
}
/* Function to display hash table */
public void display() {
for (int i = 0; i < capacity; i++) {
System.out.print("\nBucket " + (i + 1) + " : ");
ChainedHashEntry entry = hashTable[i];
while (entry != null) {
System.out.print(entry.key + " ");
entry = entry.next;
}
}
System.out.println();
}
}
/* Class HashTableChain Test */
class HashTablesChain {
public static void main(String[] args) throws IOException {
/* Make object of HashTable */
HashTable ht = new HashTable();
String inputFile = "patient.txt";
BufferedReader br = new BufferedReader(new FileReader(inputFile));
try {
String entry = br.readLine();
while (entry != null) {
String[] splited = entry.split(",");
String lastName = splited[0];
try {
ht.insert(lastName);
} catch (Exception e) {
}
entry = br.readLine();
}
} finally {
br.close();
}
boolean proceed = true;
Scanner in = new Scanner(System.in);
while (proceed) { // user choice/entry
System.out.println("_________________________________________________________________________");
System.out.println("\nChaining to store hashed data");
System.out.println("_________________________________________________________________________");
System.out.println("Pick an option: \t (d) display table \t (r) rehash \t (q) quit ");
String command = in.next();
char chr = command.charAt(0);
switch (chr) {
case 'd': {
ht.display();
break;
}
case 'r': {
try {
ht.rehash();
} catch (Exception ex) {
Logger.getLogger(HashTable.class.getName()).log(Level.SEVERE, null, ex);
}
break;
}
case 'q': {
proceed = false;
System.out.println("Thanks for stopping by!");
break;
}
default: {
System.out.println("Invalid entry. Please try again");
}
}
}
in.close();
}
}