package com.vitco.util.misc; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * Bidirection HashMap */ public class BiMap<KeyType, ValueType>{ private final Map<KeyType, ValueType> keyToValueMap = new ConcurrentHashMap<KeyType, ValueType>(); private final Map<ValueType, KeyType> valueToKeyMap = new ConcurrentHashMap<ValueType, KeyType>(); synchronized public Set<KeyType> keySet() { return keyToValueMap.keySet(); } synchronized public void put(KeyType key, ValueType value){ keyToValueMap.put(key, value); valueToKeyMap.put(value, key); } synchronized public ValueType removeByKey(KeyType key){ ValueType removedValue = keyToValueMap.remove(key); valueToKeyMap.remove(removedValue); return removedValue; } synchronized public KeyType removeByValue(ValueType value){ KeyType removedKey = valueToKeyMap.remove(value); keyToValueMap.remove(removedKey); return removedKey; } synchronized public void clear() { keyToValueMap.clear(); valueToKeyMap.clear(); } public boolean containsKey(KeyType key){ return keyToValueMap.containsKey(key); } public boolean containsValue(ValueType value){ return keyToValueMap.containsValue(value); } public KeyType getKey(ValueType value){ return valueToKeyMap.get(value); } public ValueType get(KeyType key){ return keyToValueMap.get(key); } // retrieve the amount of entries public int size() { return keyToValueMap.size(); } }