package com.koushikdutta.async.util; import java.util.ArrayList; import java.util.Hashtable; import java.util.Set; /** * Created by koush on 5/27/13. */ public class HashList<T> { class TaggedList<T> extends ArrayList<T> { Object tag; } Hashtable<String, TaggedList<T>> internal = new Hashtable<String, TaggedList<T>>(); public HashList() { } public Set<String> keySet() { return internal.keySet(); } public synchronized <V> V tag(String key) { TaggedList<T> list = internal.get(key); if (list == null) return null; return (V)list.tag; } public synchronized <V> void tag(String key, V tag) { TaggedList<T> list = internal.get(key); if (list == null) { list = new TaggedList<T>(); internal.put(key, list); } list.tag = tag; } public synchronized ArrayList<T> remove(String key) { return internal.remove(key); } public synchronized int size() { return internal.size(); } public synchronized ArrayList<T> get(String key) { return internal.get(key); } synchronized public boolean contains(String key) { ArrayList<T> check = get(key); return check != null && check.size() > 0; } synchronized public void add(String key, T value) { ArrayList<T> ret = get(key); if (ret == null) { TaggedList<T> put = new TaggedList<T>(); ret = put; internal.put(key, put); } ret.add(value); } synchronized public T pop(String key) { TaggedList<T> values = internal.get(key); if (values == null) return null; if (values.size() == 0) return null; return values.remove(values.size() - 1); } synchronized public boolean removeItem(String key, T value) { TaggedList<T> values = internal.get(key); if (values == null) return false; values.remove(value); return values.size() == 0; } }