package edu.berkeley.nlp.util;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Union of two maps (sort of). Doesn't handle duplicate keys (keys in both
* maps). Unmodifiable.
*
* @author adampauls
*
* @param <K>
*/
public class ConcatenationMap<K, V> extends AbstractMap<K, V>
{
private Set<Entry<K, V>> entrySet;
@Override
public Set<Entry<K, V>> entrySet()
{
if (entrySet == null)
{
List<Set<Entry<K, V>>> list = new ArrayList<Set<Entry<K, V>>>();
for (Map<K, V> map : maps)
{
list.add(map.entrySet());
}
entrySet = new ConcatenationSet<Entry<K, V>>(list);
}
return entrySet;
}
@Override
public V get(Object arg0)
{
for (Map<K, V> map : maps)
{
V v = map.get(arg0);
if (v != null) return v;
}
return null;
}
@Override
public boolean containsKey(Object arg0)
{
for (Map<K, V> map : maps)
{
if (map.containsKey(arg0)) return true;
}
return false;
}
private Collection<Map<K, V>> maps;
private int size = 0;
public ConcatenationMap(Collection<Map<K, V>> maps)
{
this.maps = maps;
for (Map<K, V> set : maps)
{
size += set.size();
}
}
@Override
public int size()
{
return size;
}
}