1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package ubic.basecode.dataStructure;
20
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.Collections;
24 import java.util.Comparator;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29
30
31
32
33
34
35
36
37
38
39
40 public class CountingMap<K> implements Map<K, Integer> {
41 private class AscendingCountComparator extends CountComparator {
42
43
44
45
46
47 @Override
48 public int compare( K key1, K key2 ) {
49 return map.get( key1 ).compareTo( map.get( key2 ) );
50 }
51 }
52
53 private abstract class CountComparator implements Comparator<K> {
54 }
55
56 private class DescendingCountComparator extends CountComparator {
57
58
59
60
61
62 @Override
63 public int compare( K key1, K key2 ) {
64 return map.get( key2 ).compareTo( map.get( key1 ) );
65 }
66 }
67
68 private Map<K, Integer> map;
69
70
71
72
73 public CountingMap() {
74 this( new HashMap<K, Integer>() );
75 }
76
77
78
79
80
81
82 public CountingMap( Map<K, Integer> map ) {
83 this.map = map;
84 }
85
86
87
88
89
90
91 @Override
92 public void clear() {
93 map.clear();
94 }
95
96
97
98
99
100
101 @Override
102 public boolean containsKey( Object key ) {
103 return map.containsKey( key );
104 }
105
106
107
108
109
110
111 @Override
112 public boolean containsValue( Object value ) {
113 return map.containsValue( value );
114 }
115
116
117
118
119
120
121
122 public int count( K key ) {
123 Integer i = map.get( key );
124 return i == null ? 0 : i;
125 }
126
127
128
129
130
131
132 @Override
133 public Set<java.util.Map.Entry<K, Integer>> entrySet() {
134 return map.entrySet();
135 }
136
137 @Override
138 public boolean equals( Object o ) {
139 return map.equals( o );
140 }
141
142
143
144
145
146
147 @Override
148 public Integer get( Object key ) {
149 return map.containsKey( key ) ? map.get( key ) : 0;
150 }
151
152 @Override
153 public int hashCode() {
154 return map.hashCode();
155 }
156
157
158
159
160
161
162
163
164 public int increment( K key ) {
165 Integer i = map.get( key );
166 if ( i == null ) i = 0;
167 map.put( key, ++i );
168 return i;
169 }
170
171
172
173
174
175
176
177 public void incrementAll( Collection<K> keys ) {
178 for ( K key : keys ) {
179 increment( key );
180 }
181 }
182
183
184
185
186
187
188 @Override
189 public boolean isEmpty() {
190 return map.isEmpty();
191 }
192
193
194
195
196
197
198 @Override
199 public Set<K> keySet() {
200 return map.keySet();
201 }
202
203
204
205
206 public int max() {
207 int r = 0;
208 for ( Integer i : map.values() ) {
209 if ( i > r ) {
210 r = i;
211 }
212 }
213 return r;
214 }
215
216
217
218
219
220
221 @Override
222 public Integer put( K key, Integer value ) {
223 return map.put( key, value );
224 }
225
226
227
228
229
230
231 @Override
232 public void putAll( Map<? extends K, ? extends Integer> t ) {
233 map.putAll( t );
234 }
235
236
237
238
239
240
241 @Override
242 public Integer remove( Object key ) {
243 return map.remove( key );
244 }
245
246
247
248
249
250
251
252 public boolean seen( K key ) {
253 return map.containsKey( key );
254 }
255
256
257
258
259
260
261 @Override
262 public int size() {
263 return map.size();
264 }
265
266
267
268
269
270
271 public List<K> sortedKeyList() {
272 return sortedKeyList( false );
273 }
274
275
276
277
278
279
280
281 public List<K> sortedKeyList( boolean sortDescending ) {
282 List<K> keys = new ArrayList<K>( keySet() );
283 Collections.sort( keys, sortDescending ? new DescendingCountComparator() : new AscendingCountComparator() );
284 return keys;
285 }
286
287 @Override
288 public String toString() {
289 StringBuilder sb = new StringBuilder( "[" );
290 boolean first = true;
291 for ( K key : keySet() ) {
292 if ( !first ) sb.append( ", " );
293 sb.append( key.toString() + "=" + map.get( key ) );
294 first = false;
295 }
296 return sb.toString() + "]";
297 }
298
299
300
301
302 public int total() {
303 int summation = 0;
304 for ( int value : map.values() ) {
305 summation += value;
306 }
307 return summation;
308 }
309
310
311
312
313
314
315 @Override
316 public Collection<Integer> values() {
317 return map.values();
318 }
319
320 }