PandaLib/Core/src/main/java/fr/pandacube/lib/core/util/BiMap.java

81 lines
1.8 KiB
Java
Raw Normal View History

2021-03-21 20:17:31 +01:00
package fr.pandacube.lib.core.util;
2020-05-07 18:37:06 +02:00
import java.util.Collections;
import java.util.HashMap;
2016-12-25 23:34:12 +01:00
import java.util.Iterator;
import java.util.Map.Entry;
2020-05-07 18:37:06 +02:00
import java.util.Set;
2016-12-25 23:34:12 +01:00
import java.util.function.BiConsumer;
2016-12-25 23:34:12 +01:00
public class BiMap<K, V> implements Iterable<Entry<K, V>> {
HashMap<K, V> map = new HashMap<>();
HashMap<V, K> inversedMap = new HashMap<>();
public synchronized void put(K k, V v) {
if (map.containsKey(k) || inversedMap.containsKey(v)) {
map.remove(k);
inversedMap.remove(v);
}
map.put(k, v);
inversedMap.put(v, k);
}
public synchronized V get(K k) {
return map.get(k);
}
public synchronized K getKey(V v) {
return inversedMap.get(v);
}
public synchronized boolean containsKey(K k) {
return map.containsKey(k);
}
public synchronized boolean containsValue(V v) {
return inversedMap.containsKey(v);
}
public synchronized V remove(K k) {
V v = map.remove(k);
inversedMap.remove(v);
return v;
}
public synchronized K removeValue(V v) {
K k = inversedMap.remove(v);
map.remove(k);
return k;
}
2016-12-25 23:34:12 +01:00
@Override
public Iterator<Entry<K, V>> iterator() {
2020-05-07 18:37:06 +02:00
return Collections.unmodifiableSet(map.entrySet()).iterator();
}
public Set<K> keySet() {
return Collections.unmodifiableSet(map.keySet());
}
public Set<V> valuesSet() {
return Collections.unmodifiableSet(inversedMap.keySet());
2016-12-25 23:34:12 +01:00
}
public synchronized void forEach(BiConsumer<K, V> c) {
for(Entry<K, V> entry : this) {
c.accept(entry.getKey(), entry.getValue());
}
}
2017-07-05 00:17:41 +02:00
public int size() {
return map.size();
}
2020-05-07 18:37:06 +02:00
public synchronized void clear() {
map.clear();
inversedMap.clear();
}
}