Skip to content

Commit 9ab4bda

Browse files
committed
Adding deletion to hashtables
1 parent 0ad5788 commit 9ab4bda

File tree

6 files changed

+97
-8
lines changed

6 files changed

+97
-8
lines changed

src/main/java/com/packt/datastructuresandalg/lesson3/activity/openaddressing/OpenAddrHashTable.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public OpenAddrHashTable(int capacity, HashProvider<K> hashProvider) {
1818
public void put(K key, V value) {
1919
}
2020

21+
public void remove(K key) {
22+
}
23+
2124
public Optional<V> get(K key) {
2225
return Optional.empty();
2326
}

src/main/java/com/packt/datastructuresandalg/lesson3/activity/openaddressing/solution/OpenAddrHashTable.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,49 @@
22

33
import com.packt.datastructuresandalg.lesson3.hashtable.HashProvider;
44
import com.packt.datastructuresandalg.lesson3.hashtable.HashTable;
5-
import com.packt.datastructuresandalg.lesson3.hashtable.Pair;
65

76
import java.util.Optional;
87

98
public class OpenAddrHashTable<K, V> implements HashTable<K, V> {
109
private final HashProvider<K> hashProvider;
11-
private Pair<K, V>[] array;
10+
private OpenAddrPair<K, V>[] array;
1211

1312
public OpenAddrHashTable(int capacity, HashProvider<K> hashProvider) {
14-
array = new Pair[capacity];
13+
array = new OpenAddrPair[capacity];
1514
this.hashProvider = hashProvider;
1615
}
1716

1817
public void put(K key, V value) {
1918
int s = array.length;
2019
int hashValue = hashProvider.hashKey(key, s);
2120
int i = 0;
22-
while (i < s && array[(hashValue + i) % s] != null)
21+
while (i < s && array[(hashValue + i) % s] != null &&
22+
!array[(hashValue + i) % s].isDeleted())
2323
i++;
24-
if (i < s) array[(hashValue + i) % s] = new Pair<>(key, value);
24+
if (i < s) array[(hashValue + i) % s] = new OpenAddrPair<>(key, value);
2525
}
2626

27-
public Optional<V> get(K key) {
27+
private int searchPosition(K key) {
2828
int s = array.length;
2929
int hashValue = hashProvider.hashKey(key, s);
3030
int i = 0;
3131
while (i < s &&
3232
array[(hashValue + i) % s] != null &&
3333
!array[(hashValue + i) % s].getKey().equals(key))
3434
i++;
35+
return (hashValue + i) % s;
36+
}
37+
38+
public Optional<V> get(K key) {
39+
return Optional.ofNullable(array[searchPosition(key)])
40+
.filter(kv -> !kv.isDeleted())
41+
.filter(kv -> kv.getKey().equals(key))
42+
.map(OpenAddrPair::getValue);
43+
}
3544

36-
return Optional.ofNullable(array[(hashValue + i) % s])
37-
.filter(kv -> kv.getKey().equals(key)).map(Pair::getValue);
45+
public void remove(K key) {
46+
Optional.ofNullable(array[searchPosition(key)])
47+
.ifPresent(kv -> kv.setDeleted(true));
3848
}
3949

4050
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.packt.datastructuresandalg.lesson3.activity.openaddressing.solution;
2+
3+
public class OpenAddrPair<K, V> {
4+
private final K key;
5+
private final V value;
6+
private boolean deleted;
7+
8+
public OpenAddrPair(K key, V value) {
9+
this.key = key;
10+
this.value = value;
11+
this.deleted = false;
12+
}
13+
14+
public K getKey() {
15+
return key;
16+
}
17+
18+
public V getValue() {
19+
return value;
20+
}
21+
22+
public boolean isDeleted() {
23+
return deleted;
24+
}
25+
26+
public void setDeleted(boolean deleted) {
27+
this.deleted = deleted;
28+
}
29+
}

src/main/java/com/packt/datastructuresandalg/lesson3/hashtable/ChainedHashTable.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public Optional<V> get(K key) {
2626
.map(Pair::getValue);
2727
}
2828

29+
public void remove(K key) {
30+
int hashValue = hashProvider.hashKey(key, array.length);
31+
array[hashValue].removeIf(p -> p.getKey().equals(key));
32+
}
33+
2934
public static void main(String args[]) {
3035
ChainedHashTable<Integer, String> chainedHashTable = new ChainedHashTable<>(10, new RemainderHashing());
3136
chainedHashTable.put(12,"Isabel");
@@ -42,5 +47,7 @@ public static void main(String args[]) {
4247
System.out.println(chainedHashTable.get(31));
4348
System.out.println(chainedHashTable.get(42));
4449
System.out.println(chainedHashTable.get(45));
50+
chainedHashTable.remove(31);
51+
System.out.println(chainedHashTable.get(31));
4552
}
4653
}

src/main/java/com/packt/datastructuresandalg/lesson3/hashtable/HashTable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ public interface HashTable<K,V> {
66
void put(K key,V value);
77

88
Optional<V> get(K key);
9+
10+
void remove(K key);
911
}

src/test/java/com/packt/datastructuresandalg/lesson3/activity/openaddressing/OpenAddrHashTableTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,26 @@ public void testItemOnOccupiedSlotHashTable() {
3434
assertEquals(Optional.of("Test6"), hashTable.get(6));
3535
}
3636

37+
public void testGetItemAfterRemove() {
38+
OpenAddrHashTable<Integer, String> hashTable = new OpenAddrHashTable<>(10, new RemainderHashing());
39+
hashTable.put(5, "Test5");
40+
hashTable.put(15, "Test15");
41+
hashTable.put(6, "Test6");
42+
hashTable.remove(6);
43+
assertEquals(Optional.empty(), hashTable.get(6));
44+
}
45+
46+
public void testInsertItemAfterRemove() {
47+
OpenAddrHashTable<Integer, String> hashTable = new OpenAddrHashTable<>(10, new RemainderHashing());
48+
hashTable.put(5, "Test5");
49+
hashTable.put(15, "Test15");
50+
hashTable.put(6, "Test6");
51+
hashTable.remove(6);
52+
hashTable.put(25, "Test25");
53+
assertEquals(Optional.of("Test25"), hashTable.get(25));
54+
}
55+
56+
3757
public void testItemWrapsAroundHashTable() {
3858
OpenAddrHashTable<Integer, String> hashTable = new OpenAddrHashTable<>(10, new RemainderHashing());
3959
hashTable.put(8, "Test8");
@@ -55,6 +75,24 @@ public void testItemWrapsAroundHashTable() {
5575
assertEquals(Optional.empty(), hashTable.get(58));
5676
}
5777

78+
public void testRemoveItemWrapsAroundHashTable() {
79+
OpenAddrHashTable<Integer, String> hashTable = new OpenAddrHashTable<>(10, new RemainderHashing());
80+
hashTable.put(8, "Test8");
81+
hashTable.put(18, "Test18");
82+
hashTable.put(28, "Test28");
83+
hashTable.put(38, "Test38");
84+
hashTable.put(48, "Test48");
85+
hashTable.put(9, "Test9");
86+
hashTable.put(19, "Test19");
87+
hashTable.put(0, "Test0");
88+
hashTable.remove(9);
89+
hashTable.put(58, "Test58");
90+
assertEquals(Optional.empty(), hashTable.get(9));
91+
assertEquals(Optional.of("Test0"), hashTable.get(0));
92+
assertEquals(Optional.of("Test58"), hashTable.get(58));
93+
}
94+
95+
5896
public void testSearchItemOnFullHashTable() {
5997
OpenAddrHashTable<Integer, String> hashTable = new OpenAddrHashTable<>(10, new RemainderHashing());
6098
hashTable.put(2, "Test2");

0 commit comments

Comments
 (0)