ChainedMap.java

package eu.javaexperience.collection.map;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ChainedMap<K, V> extends AbstractMap<K, V> implements Map<K, V>
{
	public ChainedMap(Map<K, V>... maps)
	{
		backs = maps;
	}
	
	protected Map<K, V>[] backs;
	
	@Override
	public boolean containsKey(Object key)
	{
		for(Map<K, V> m:backs)
		{
			if(m.containsKey(key))
			{
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean containsValue(Object value)
	{
		for(Map<K, V> m:backs)
		{
			if(m.containsValue(value))
			{
				return true;
			}
		}
		return false;
	}

	@Override
	public V get(Object key)
	{
		for(Map<K, V> m:backs)
		{
			V ret =  m.get(key);
			if(null != ret)
			{
				return ret;
			}
		}
		return null;
	}

	@Override
	public V put(K key, V value)
	{
		return backs[0].put(key, value);
	}

	@Override
	public V remove(Object key)
	{
		return backs[0].remove(key);
	}

	@Override
	public void putAll(Map<? extends K, ? extends V> m)
	{
		for(Entry<? extends K, ? extends V> e:m.entrySet())
		{
			backs[0].put(e.getKey(), e.getValue());
		}
	}

	@Override
	public void clear()
	{
		backs[0].clear();
		
	}

	@Override
	public Set<K> keySet()
	{
		HashSet<K> keys = new HashSet<>();
		for(Map<K, V> m:backs)
		{
			keys.addAll(m.keySet());
		}
		return keys;
	}
}