-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJHashSet.java
More file actions
143 lines (118 loc) · 3.1 KB
/
JHashSet.java
File metadata and controls
143 lines (118 loc) · 3.1 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
package kb.data_structures.hashtable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Custom {@link Set} implementation. Uses custom {@link Map} implementation
* with dummy object as a value.
*
* @param <E> represents the type of the element of the set
*
* @author dimcho.nedev
*/
public class JHashSet<E> implements Set<E> {
private final String NOT_SUPPORTED_MSG = "Not supported yet.";
private static final Object DUMMY_VAL = new Object();
private Map<E, Object> map;
public JHashSet() {
map = new JHashTable<>();
}
@Override
public int size() {
return map.size();
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public boolean contains(Object o) {
return map.containsKey(o);
}
@Override
public Iterator<E> iterator() {
return map.keySet().iterator();
}
@Override
public Object[] toArray() {
Object[] output = new Object[map.size()];
int i = 0;
for (Object obj : map.keySet())
output[i++] = obj;
return output;
}
@Override
public <T> T[] toArray(T[] a) {
throw new UnsupportedOperationException(NOT_SUPPORTED_MSG);
}
@Override
public boolean add(E e) {
return map.put(e, DUMMY_VAL) != null;
}
@Override
public boolean remove(Object o) {
return map.remove(o) != null;
}
@Override
public boolean containsAll(Collection<?> c) {
for (Object key : c)
if (!map.containsKey(key))
return false;
return true;
}
@Override
public boolean addAll(Collection<? extends E> c) {
boolean isChanged = false;
for (E key : c)
if (map.put(key, DUMMY_VAL) == null)
isChanged = true;
return isChanged;
}
@Override
public boolean retainAll(Collection<?> c) {
boolean isChanged = false;
Set<Object> colSet = new JHashSet<>();
for (Object o : c)
colSet.add(o);
for (E key : map.keySet()) {
if (!colSet.contains(key)) {
this.remove(key);
isChanged = true;
}
}
return isChanged;
}
@Override
public boolean removeAll(Collection<?> c) {
boolean isChanged = false;
for (Object key : c)
if (map.remove(key) != null)
isChanged = true;
return isChanged;
}
@Override
public void clear() {
map.clear();
}
@Override
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Set))
return false;
Set<?> set = (Set<?>) o;
if (set.size() != JHashSet.this.size())
return false;
for (E key : map.keySet()) {
if (!set.contains(key))
return false;
}
return true;
}
@Override
public String toString() {
return Arrays.toString(this.toArray());
}
}