Skip to content

Commit ce98558

Browse files
committed
entry set for HasMapToInt
1 parent 1d93f2f commit ce98558

File tree

1 file changed

+100
-32
lines changed

1 file changed

+100
-32
lines changed

src/main/java/org/apache/sysds/runtime/frame/data/columns/HashMapToInt.java

Lines changed: 100 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
package org.apache.sysds.runtime.frame.data.columns;
2121

2222
import java.io.Serializable;
23+
import java.util.AbstractSet;
2324
import java.util.Collection;
25+
import java.util.Iterator;
2426
import java.util.Map;
2527
import java.util.Set;
2628
import java.util.function.BiConsumer;
@@ -32,13 +34,12 @@ public class HashMapToInt<K> implements Map<K, Integer>, Serializable, Cloneable
3234
static final int MAXIMUM_CAPACITY = 1 << 30;
3335
static final float DEFAULT_LOAD_FACTOR = 0.75f;
3436

35-
36-
static class Node<K> {
37+
static class Node<K> implements Entry<K, Integer> {
3738
final K key;
3839
int value;
3940
Node<K> next;
4041

41-
Node( K key, int value, Node<K> next) {
42+
Node(K key, int value, Node<K> next) {
4243
this.key = key;
4344
this.value = value;
4445
this.next = next;
@@ -47,6 +48,21 @@ static class Node<K> {
4748
public final void setNext(Node<K> n) {
4849
next = n;
4950
}
51+
52+
@Override
53+
public K getKey() {
54+
return key;
55+
}
56+
57+
@Override
58+
public Integer getValue() {
59+
return value;
60+
}
61+
62+
@Override
63+
public Integer setValue(Integer value) {
64+
return this.value = value;
65+
}
5066
}
5167

5268
protected Node<K>[] buckets;
@@ -58,12 +74,9 @@ public HashMapToInt(int capacity) {
5874
alloc(Math.max(capacity, 16));
5975
}
6076

61-
62-
63-
6477
@SuppressWarnings({"unchecked"})
6578
protected void alloc(int size) {
66-
Node<K>[] tmp = (Node<K>[])new Node[size];
79+
Node<K>[] tmp = (Node<K>[]) new Node[size];
6780
buckets = tmp;
6881
}
6982

@@ -102,15 +115,16 @@ public int getI(K key) {
102115
final int ix = hash(key);
103116
Node<K> b = buckets[ix];
104117
if(b != null) {
105-
do{
118+
do {
106119
if(b.key.equals(key))
107120
return b.value;
108-
} while((b = b.next) != null);
121+
}
122+
while((b = b.next) != null);
109123
}
110124
return -1;
111125
}
112126

113-
public int hash(K key){
127+
public int hash(K key) {
114128
return Math.abs(key.hashCode()) % buckets.length;
115129
}
116130

@@ -123,31 +137,30 @@ public Integer put(K key, Integer value) {
123137
return null;
124138
}
125139

126-
@Override
127-
public Integer putIfAbsent(K key, Integer value){
140+
@Override
141+
public Integer putIfAbsent(K key, Integer value) {
128142
int i = putIfAbsentI(key, value);
129143
if(i != -1)
130144
return i;
131145
else
132146
return null;
133147
}
134148

135-
public int putIfAbsentI(K key, int value){
149+
public int putIfAbsentI(K key, int value) {
136150
final int ix = hash(key);
137151
Node<K> b = buckets[ix];
138-
if( b == null)
152+
if(b == null)
139153
return createBucket(ix, key, value);
140-
else
154+
else
141155
return putIfAbsentBucket(ix, key, value);
142156
}
143157

144-
145158
private int putIfAbsentBucket(int ix, K key, int value) {
146159
Node<K> b = buckets[ix];
147-
while(true){
160+
while(true) {
148161
if(b.key.equals(key))
149162
return b.value;
150-
if(b.next == null){
163+
if(b.next == null) {
151164
b.next = new Node<>(key, value, null);
152165
size++;
153166
return -1;
@@ -166,21 +179,21 @@ public int putI(K key, int value) {
166179
}
167180

168181
private int createBucket(int ix, K key, int value) {
169-
buckets[ix] = new Node<K>(key, value, null );
182+
buckets[ix] = new Node<K>(key, value, null);
170183
size++;
171184
return -1;
172185
}
173186

174187
private int addToBucket(int ix, K key, int value) {
175188
Node<K> b = buckets[ix];
176-
while(true){
189+
while(true) {
177190

178-
if(b.key.equals(key)){
191+
if(b.key.equals(key)) {
179192
int tmp = b.value;
180193
b.value = value;
181194
return tmp;
182195
}
183-
if(b.next == null){
196+
if(b.next == null) {
184197
b.next = new Node<>(key, value, null);
185198
size++;
186199
return -1;
@@ -215,29 +228,84 @@ public Collection<Integer> values() {
215228
}
216229

217230
@Override
218-
public Set<Entry<K, Integer>> entrySet() {
219-
throw new UnsupportedOperationException("Unimplemented method 'entrySet'");
231+
public Set<Map.Entry<K, Integer>> entrySet() {
232+
return new EntrySet();
220233
}
221234

222-
@Override
235+
@Override
223236
public void forEach(BiConsumer<? super K, ? super Integer> action) {
224-
for(Node<K> n : buckets){
225-
if(n != null){
226-
do{
237+
for(Node<K> n : buckets) {
238+
if(n != null) {
239+
do {
227240
action.accept(n.key, n.value);
228241
}
229242
while((n = n.next) != null);
230243
}
231244
}
232245
}
233246

234-
@Override
235-
public String toString(){
247+
@Override
248+
public String toString() {
236249
StringBuilder sb = new StringBuilder();
237-
this.forEach((k,v) -> {
238-
sb.append("("+k +"→" + v+")");
250+
this.forEach((k, v) -> {
251+
sb.append("(" + k + "→" + v + ")");
239252
});
240253
return sb.toString();
241254
}
242255

256+
private final class EntrySet extends AbstractSet<Map.Entry<K, Integer>> {
257+
258+
@Override
259+
public int size() {
260+
return size;
261+
}
262+
263+
@Override
264+
public Iterator<Entry<K, Integer>> iterator() {
265+
return new EntryIterator();
266+
}
267+
268+
}
269+
270+
private final class EntryIterator implements Iterator<Entry<K, Integer>> {
271+
Node<K> next;
272+
int bucketId = 0;
273+
274+
protected EntryIterator() {
275+
for(; bucketId < buckets.length; bucketId++) {
276+
if(buckets[bucketId] != null) {
277+
next = buckets[bucketId];
278+
break;
279+
}
280+
}
281+
}
282+
283+
@Override
284+
public boolean hasNext() {
285+
return next != null;
286+
}
287+
288+
@Override
289+
public Entry<K, Integer> next() {
290+
291+
Node<K> e = next;
292+
293+
if(e.next != null)
294+
next = e.next;
295+
else {
296+
for(; ++bucketId < buckets.length; bucketId++) {
297+
if(buckets[bucketId] != null) {
298+
next = buckets[bucketId];
299+
break;
300+
}
301+
}
302+
if(bucketId == buckets.length)
303+
next = null;
304+
}
305+
306+
return e;
307+
}
308+
309+
}
310+
243311
}

0 commit comments

Comments
 (0)