/**
* Copyright (c) 2011 Michael Kutschke.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Michael Kutschke - initial API and implementation.
*/
package org.eclipse.recommenders.internal.jayes.util;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class BidirectionalMap<K, V> implements Map<K, V> {
private final Map<K, V> keyValue = new HashMap<K, V>();
private final Map<V, K> valueKey = new HashMap<V, K>();
public BidirectionalMap() {
}
@Override
public int size() {
return keyValue.size();
}
@Override
public boolean isEmpty() {
return keyValue.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return keyValue.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return valueKey.containsKey(value);
}
@Override
public V get(Object key) {
return keyValue.get(key);
}
public K getKey(V value) {
return valueKey.get(value);
}
@Override
public V put(K key, V value) {
if (containsValue(value) && valueKey.get(value) != key) {
throw new IllegalArgumentException(value + " has already been assigned an other key, violating uniqueness");
}
V val = keyValue.put(key, value);
valueKey.remove(val);
valueKey.put(value, key);
return val;
}
@Override
public V remove(Object key) {
V v = keyValue.remove(key);
valueKey.remove(v);
return v;
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
for (Entry<? extends K, ? extends V> ent : m.entrySet()) {
put(ent.getKey(), ent.getValue());
}
}
@Override
public void clear() {
keyValue.clear();
valueKey.clear();
}
@Override
public Set<K> keySet() {
return keyValue.keySet();
}
@Override
public Collection<V> values() {
return valueKey.keySet();
}
@Override
public Set<java.util.Map.Entry<K, V>> entrySet() {
return keyValue.entrySet();
}
}