import
java.util.HashMap;
import
java.util.HashSet;
import
java.util.Map;
import
java.util.Set;
public
class
BidirectionalMap<K, V> {
private
final
Map<K, V> keyToValueMap =
new
HashMap<>();
private
final
Map<V, K> valueToKeyMap =
new
HashMap<>();
public
void
put(K key, V value)
{
keyToValueMap.put(key, value);
valueToKeyMap.put(value, key);
}
public
V getValueByKey(K key) {
return
keyToValueMap.get(key);
}
public
K getKeyByValue(V value) {
return
valueToKeyMap.get(value);
}
public
boolean
containsKey(K key) {
return
keyToValueMap.containsKey(key);
}
public
boolean
containsValue(V value) {
return
valueToKeyMap.containsKey(value);
}
public
void
removeByKey(K key) {
V value = keyToValueMap.remove(key);
valueToKeyMap.remove(value);
}
public
void
removeAll() {
keyToValueMap.clear();
valueToKeyMap.clear();
}
public
Set<K> getAllKeys() {
return
keyToValueMap.keySet();
}
public
Set<V> getAllValues() {
return
valueToKeyMap.keySet();
}
public
static
void
main(String[] args) {
BidirectionalMap<Integer, String> biMap =
new
BidirectionalMap<>();
biMap.put(
1
,
"One"
);
biMap.put(
2
,
"Two"
);
biMap.put(
3
,
"Three"
);
System.out.println(
"Value for key 2: "
+ biMap.getValueByKey(
2
));
System.out.println(
"Key for value 'Three': "
+ biMap.getKeyByValue(
"Three"
));
System.out.println(
"Contains key 4: "
+ biMap.containsKey(
4
));
System.out.println(
"Contains value 'One': "
+ biMap.containsValue(
"One"
));
biMap.removeByKey(
1
);
System.out.println(
"All keys: "
+ biMap.getAllKeys());
System.out.println(
"All values: "
+ biMap.getAllValues());
biMap.removeAll();
System.out.println(
"Is the map empty? "
+ (biMap.getAllKeys().isEmpty() && biMap.getAllValues().isEmpty()));
}
}