2020package org .apache .sysds .runtime .frame .data .columns ;
2121
2222import java .io .Serializable ;
23+ import java .util .AbstractSet ;
2324import java .util .Collection ;
25+ import java .util .Iterator ;
2426import java .util .Map ;
2527import java .util .Set ;
2628import 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