/**
*
*/
package ecologylab.generic;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* A HashMap with an ArrayList backing store, for speedy linear and hashed access.
*
* @author andruid
*
*/
public class HashMapArrayList<K, V> extends HashMap<K, V> implements Iterable<V>
{
protected final ArrayList<V> arrayList;
/**
*
*/
public HashMapArrayList()
{
arrayList = new ArrayList<V>();
}
/**
* @param arg0
*/
public HashMapArrayList(int arg0)
{
super(arg0);
arrayList = new ArrayList<V>(arg0);
}
/**
* @param arg0
*/
public HashMapArrayList(Map arg0)
{
super(arg0);
arrayList = new ArrayList<V>(arg0.size());
}
/**
* @param arg0
* @param arg1
*/
public HashMapArrayList(int arg0, float arg1)
{
super(arg0, arg1);
arrayList = new ArrayList<V>(arg0);
}
@Override public V put(K key, V value)
{
V result = super.put(key, value);
if (result != null) // the object that was overridden
arrayList.remove(result);
arrayList.add(value);
return result;
}
@Override public void putAll(Map<? extends K, ? extends V> map)
{
for (K key : map.keySet())
this.put(key, map.get(key));
}
public V get(int index)
{
return arrayList.get(index);
}
@Override
public Iterator<V> iterator()
{
return arrayList.iterator();
}
@Override public V remove(Object key)
{
V result = super.remove(key);
if (result != null)
arrayList.remove(result);
return result;
}
@Override public void clear()
{
super.clear();
arrayList.clear();
}
public void recycle()
{
super.clear();
int last = arrayList.size() - 1;
for (int i=last; i>=0; i--)
{
V that = arrayList.remove(i);
// that.recycle() -- must enforce that implements Recyclable
}
}
@Override public Collection<V> values()
{
return arrayList;
}
}