//idega 2000 - Tryggvi Larusson /* *Copyright 2000 idega.is All Rights Reserved. */ package com.idega.util.datastructures; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; import com.idega.util.ListUtil; /** *Class similar to Hashtable but with multiple values for each key *@author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a> *@version 0.9 * @param <K> * @param <V> */ public class HashtableMultivalued<K, T extends Collection<V>, V> extends Hashtable<K, Collection<V>> { private static final long serialVersionUID = -7189090701326564598L; public V putValue(K key, V value) { Collection<V> values = getList(key); values.add(value); super.put(key, values); return value; } @Override public Collection<V> put(K key, Collection<V> coll){ Collection<V> values = getList(key); values.addAll(coll); return super.put(key, values); } @Override public Collection<V> get(Object key){ return super.get(key); } public V getFirstValue(K key) { Collection<V> values = getList(key, false); if (ListUtil.isEmpty(values)) { return null; } return values.iterator().next(); } /** * Returns the first object with this key and removes it from the Hashtable * @param key * @return */ public V getAndRemove(K key) { V obj = getFirstValue(key); if (obj == null) { return null; } getList(key, false).remove(obj); return obj; } public Collection<V> getList(Object key) { return getList(key, true); } private Collection<V> getList(Object key, boolean initialize) { Collection<V> values = super.get(key); if (values == null && initialize) { values = new ArrayList<V>(); } return values; } public int getNumberOfValues(K key){ Collection<V> values = getList(key, false); return ListUtil.isEmpty(values) ? 0 : values.size(); } }