-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDynamicHashTable.java
More file actions
216 lines (197 loc) · 7.49 KB
/
DynamicHashTable.java
File metadata and controls
216 lines (197 loc) · 7.49 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
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
//*************************************************************************************
// DynamicHashTable.java
//
// AUTHOR: DUSTIN KABAN
// DATE: APRIL 13th, 2021
//
// This is an implementation of a hash table, that allows for dynamic resizing
// and uses the extraction method with division using the last three digits of the ISBN mod the array length
// as the hash address. Collisions are resolved using Linear Probing.
//*************************************************************************************
public class DynamicHashTable
{
//Create an array of books, this will act as our hashtable
Book[] bookArray;
//The loadFactor will help determine when resizing is required
float loadFactor;
//This helps keep track of the number of books for the loadFactor calculation
int numberOfBooks = 0;
//Instantiate the default hash table
public DynamicHashTable(int initialCapacity, float loadFactorCapacity)
{
loadFactor = loadFactorCapacity;
bookArray = new Book[initialCapacity];
//Populate with empty books (ISBN = 0) so we can compare empty elements
populateArrayWithEmptyBooks(bookArray);
}
public void put(Book book)
{
//Verify that it is actually a book
if(!book.getISBN().equals("0") && book.getISBN().length() == 10)
{
//Get the hash address to place the book
int hashAddress = findOpenHashAddress(book,bookArray);
if(hashAddress != -1)
{
//Place the book and update the number of books, then check if resizing required
bookArray[findOpenHashAddress(book,bookArray)] = book;
numberOfBooks++;
validateLoadFactor();
}
}
}
public void remove(Book book)
{
int hashAddress = locateBookInHashTable(book);
if(hashAddress != -1)
{
bookArray[hashAddress] = new Book("","0");
numberOfBooks--;
}
}
//Very similar to the remove functionality, but we don't decrement numberOfBooks
public int find(Book book)
{
//Return the hashAddress. It will return -1 if it is not found
//return locateBookInHashTable(book);
//Get the last 3 digits from the books ISBN
String tempISBN = book.getISBN();
int digitsFromISBN = Integer.parseInt(tempISBN.substring(tempISBN.length() - 3));
int hashAddress = digitsFromISBN % bookArray.length;
//If the ISBN's match, we found the element so just remove it.
if(book.getISBN().equals(bookArray[hashAddress].getISBN()))
{
bookArray[hashAddress] = new Book("","0");
}
else //We need to loop through the array to find the index
{
//We need to use division to find a new spot for it
for(int i=0;i<bookArray.length;i++)
{
hashAddress = (digitsFromISBN + i) % bookArray.length;
if(bookArray[hashAddress].getISBN().equals(book.getISBN()))
{
//Found empty index
return hashAddress;
}
else
{
hashAddress = -1;
}
}
}
return hashAddress;
}
private int locateBookInHashTable(Book book)
{
//Get the last 3 digits from the books ISBN
String tempISBN = book.getISBN();
int digitsFromISBN = Integer.parseInt(tempISBN.substring(tempISBN.length() - 3));
int hashAddress = digitsFromISBN % bookArray.length;
//If the ISBN's match, we found the element so just remove it.
if(book.getISBN().equals(bookArray[hashAddress].getISBN()))
{
bookArray[hashAddress] = new Book("","0");
}
else
{
//Else, we need to do linear probing to find the element
hashAddress = linearProbeToFindIndex(digitsFromISBN,bookArray);
if(hashAddress != -1)
{
bookArray[hashAddress] = new Book("","0");
}
}
return hashAddress;
}
private int findOpenHashAddress(Book book, Book[] array)
{
//Get the last 3 digits from the books ISBN
String tempISBN = book.getISBN();
int digitsFromISBN = Integer.parseInt(tempISBN.substring(tempISBN.length() - 3));
int hashAddress = digitsFromISBN % array.length;
if (!array[hashAddress].getISBN().equals("0"))
{
//We do a linear probe to find a new index
hashAddress = linearProbeToFindIndex(digitsFromISBN, array);
}
return hashAddress;
}
private int linearProbeToFindIndex(int digitsFromISBN, Book[] array)
{
int hashAddress = 0;
//We need to use division to find a new spot for it
for(int i=0;i<array.length;i++)
{
hashAddress = (digitsFromISBN + i) % array.length;
if(array[hashAddress].getISBN().equals("0"))
{
//Found empty index
return hashAddress;
}
}
return -1;
}
private void populateArrayWithEmptyBooks(Book[] array)
{
//Loop through the array and fill it with empty books
for(int i=0;i<array.length;i++)
{
array[i] = new Book("","0");
}
}
private void validateLoadFactor()
{
//If the load factor is exceeded, we need to expand the size of the array
if(((float)numberOfBooks / bookArray.length) > loadFactor)
{
growHashtable();
}
}
private void growHashtable()
{
//Create a blank array of the new size, populate with empty books then shift old elements over
//Then copy that array over to the working bookArray
Book[] tempBookArray = new Book[bookArray.length * 2];
populateArrayWithEmptyBooks(tempBookArray);
moveOldToNew(tempBookArray);
bookArray = tempBookArray;
}
private void moveOldToNew(Book[] cleanArray)
{
//Loop through the bookArray, validate if it's a book, then rehash in the cleanArray
for(int i=0;i<bookArray.length;i++)
{
Book book = bookArray[i];
//Check if the element is actually a book
if(!book.getISBN().equals("0"))
{
//Find an open hash address
int hashAddress = findOpenHashAddress(book, cleanArray);
if(hashAddress != -1)
{
//Assign the book to the hashAddress in the array
cleanArray[hashAddress] = book;
}
}
}
}
//Display the hash table to the user in a readable format.
public void displayHashtable()
{
System.out.println("------------------ HASH TABLE ------------------");
for(int i=0;i<bookArray.length;i++)
{
Book book = bookArray[i];
if(book.getISBN().equals("0"))
{
System.out.println("Book[" + i + "] is BLANK");
}
else
{
System.out.println("Book[" + i + "], Name: " + book.getName() + ", ISBN: " + book.getISBN());
}
}
System.out.println("-------------------------------------------------");
}
}