1 package cz.cuni.amis.utils.maps;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.List;
7
8 /**
9 * Map containing lists of items. Whenever a list under some key is requested and does not exists,
10 * the HashMapList automatically creates new one.
11 * <p><p>
12 * The implementation is unsynchronized, created lists are synchronized (just iteration over list must
13 * be synchronized by the user as described in Java(tm) documentation).
14 *
15 * @author Jimmy
16 *
17 * @param <KEY>
18 * @param <ITEM>
19 */
20 public class HashMapList<KEY, ITEM> extends HashMap<KEY, List<ITEM>>{
21
22 /**
23 * Returns a list under a specific key in the map. If list does not exist, it
24 * automatically creates new (synchronized) one, inserts it into map and returns it.
25 */
26 @Override
27 public List<ITEM> get(Object key) {
28 List<ITEM> list = super.get(key);
29 if (list != null) return list;
30 list = Collections.synchronizedList(new ArrayList<ITEM>());
31 super.put((KEY)key, list);
32 return list;
33 }
34
35 /**
36 * Add a new item at the end of the list under a specific key. If list does not exists,
37 * it automatically creates new (synchronized) one.
38 * @param key
39 * @param item
40 */
41 public void add(KEY key, ITEM item) {
42 get(key).add(item);
43 }
44
45 /**
46 * Remove returns the removed item, if item was non-existent, it returns empty list.
47 * @param key
48 * @return
49 */
50 @Override
51 public List<ITEM> remove(Object key) {
52 List<ITEM> list = super.remove(key);
53 if (list != null) return list;
54 return Collections.synchronizedList(new ArrayList<ITEM>(0));
55 }
56
57 /**
58 * Remove an item at 'index' from the list under a specific key. The list bounds are not checked.
59 * @param key
60 * @param index
61 * @return
62 */
63 public ITEM remove(KEY key, int index) {
64 return get(key).remove(index);
65 }
66
67 /**
68 * Returns first item from the list under a specific key. If the list is empty, returns null.
69 * @param key
70 * @return
71 */
72 public ITEM peek(KEY key) {
73 List<ITEM> list = get(key);
74 if (list.size() > 0) return list.get(0);
75 return null;
76 }
77
78 /**
79 * Removes first item from the list under a specific key.
80 * @param key
81 * @return
82 */
83 public ITEM pull(KEY key) {
84 return remove(key, 0);
85 }
86
87 }