forked from functionaljava/functionaljava
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHashSet.java
More file actions
155 lines (138 loc) · 3.92 KB
/
HashSet.java
File metadata and controls
155 lines (138 loc) · 3.92 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
package fj.data;
import fj.Equal;
import fj.Hash;
import fj.Unit;
import static fj.Unit.unit;
import java.util.Collection;
import java.util.Iterator;
/**
* A mutable hash set that guarantees uniqueness of its elements providing O(1) lookup.
*
* @version %build.number%
* @see HashMap
*/
public final class HashSet<A> implements Iterable<A> {
/**
* Returns an iterator for this hash set. This method exists to permit the use in a <code>for</code>-each loop.
*
* @return A iterator for this hash set.
*/
public Iterator<A> iterator() {
return toCollection().iterator();
}
private final HashMap<A, Unit> m;
/**
* Construct a hash set with the given equality and hashing strategy.
*
* @param e The equality strategy.
* @param h The hashing strategy.
*/
public HashSet(final Equal<A> e, final Hash<A> h) {
m = new HashMap<A, Unit>(e, h);
}
/**
* Construct a hash set with the given equality and hashing strategy.
*
* @param e The equality strategy.
* @param h The hashing strategy.
* @param initialCapacity The initial capacity.
*/
public HashSet(final Equal<A> e, final Hash<A> h, final int initialCapacity) {
m = new HashMap<A, Unit>(e, h, initialCapacity);
}
/**
* Construct a hash set with the given equality and hashing strategy.
*
* @param e The equality strategy.
* @param h The hashing strategy.
* @param initialCapacity The initial capacity.
* @param loadFactor The load factor.
*/
public HashSet(final Equal<A> e, final Hash<A> h, final int initialCapacity, final float loadFactor) {
m = new HashMap<A, Unit>(e, h, initialCapacity, loadFactor);
}
/**
* Compare two values for equality using the underlying equality strategy.
*
* @param a1 One value to compare.
* @param a2 The other value to compare.
* @return <code>true</code> if the two values are equal, <code>false</code> otherwise.
*/
public boolean eq(final A a1, final A a2) {
return m.eq(a1, a2);
}
/**
* Compute the hash of the given value using the underlying hashing strategy.
*
* @param a The value to computer the hash of.
* @return The hash of the given value.
*/
public int hash(final A a) {
return m.hash(a);
}
/**
* Determines if this hash set contains the given element.
*
* @param a The element to look for in this hash set.
* @return <code>true</code> if this hash set contains the given element, <code>false</code> otherwise.
*/
public boolean contains(final A a) {
return m.contains(a);
}
/**
* Insert the given element into this hash set.
*
* @param a The element to insert.
*/
public void set(final A a) {
m.set(a, unit());
}
/**
* Clear all elements from this hash set.
*/
public void clear() {
m.clear();
}
/**
* Determines if this hash set contains any elements.
*
* @return <code>true</code> if this hash set contains no elements, <code>false</code> otherwise.
*/
public boolean isEmpty() {
return m.isEmpty();
}
/**
* Returns the number of entries in this hash set.
*
* @return The number of entries in this hash set.
*/
public int size() {
return m.size();
}
/**
* Deletes the given element from this hash set.
*
* @param a The element to delete from this hash set.
* @return <code>true</code> if this hash set contained the given element prior to deletion, <code>false</code>
* otherwise.
*/
public boolean delete(final A a) {
return m.getDelete(a).isSome();
}
/**
* Returns a list projection of this hash set.
*
* @return A list projection of this hash set.
*/
public List<A> toList() {
return m.keys();
}
/**
* Projects an immutable collection of this hash set.
*
* @return An immutable collection of this hash set.
*/
public Collection<A> toCollection() {
return toList().toCollection();
}
}