我有一个multimap(就像Guava提供的那样):
Multimap<K, V>
可以在逻辑上看作:
Map<K, Set<V>>
我的multimap中的数据具有唯一键和唯一值。即,永远不会将相同的值分配给多个密钥。
除了维护两个Map结构之外,是否有人知道现有的class / api可能会让我通过键或值快速查找。
e.g。
Collection<V> get(K)
...and...
K getKeyByValue(V)
顺便说一句,地图必须是可变的,即我的数据一直在变化。 (对于不可变映射,Guava提供了一个ImmutableMultimap.inverse(),如果我的Map可以是不可变的,它将解决这个问题。)
任何帮助都会得到赞赏。
答案 0 :(得分:1)
试试这个
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
public class MyMap<K, V> implements Multimap<K, V> {
private Multimap<K, V> key2Value = ArrayListMultimap.create();
private Map<V, K> value2key = Maps.newHashMap();
public K getKeyByValue(V value) {
return value2key.get(value);
}
@Override
public int size() {
return key2Value.size();
}
@Override
public boolean isEmpty() {
return key2Value.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return key2Value.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return key2Value.containsValue(value);
}
@Override
public boolean containsEntry(Object key, Object value) {
return key2Value.containsEntry(key, value);
}
@Override
public boolean put(K key, V value) {
value2key.put(value, key);
return key2Value.put(key, value);
}
@Override
public boolean remove(Object key, Object value) {
value2key.remove(value);
return key2Value.remove(key, value);
}
@Override
public boolean putAll(K key, Iterable<? extends V> values) {
for (V value : values) {
value2key.put(value, key);
}
return key2Value.putAll(key, values);
}
@Override
public boolean putAll(Multimap<? extends K, ? extends V> multimap) {
for (Entry<? extends K, ? extends V> e : multimap.entries()) {
value2key.put(e.getValue(), e.getKey());
}
return key2Value.putAll(multimap);
}
@Override
public Collection<V> replaceValues(K key, Iterable<? extends V> values) {
Collection<V> replaced = key2Value.replaceValues(key, values);
for (V value : replaced) {
value2key.remove(value);
}
for (V value : values) {
value2key.put(value, key);
}
return replaced;
}
@Override
public Collection<V> removeAll(Object key) {
Collection<V> removed = key2Value.removeAll(key);
for (V value : removed) {
value2key.remove(value);
}
return removed;
}
@Override
public void clear() {
value2key.clear();
key2Value.clear();
}
@Override
public Collection<V> get(K key) {
return key2Value.get(key);
}
@Override
public Set<K> keySet() {
return key2Value.keySet();
}
@Override
public Multiset<K> keys() {
return key2Value.keys();
}
@Override
public Collection<V> values() {
return key2Value.values();
}
@Override
public Collection<Entry<K, V>> entries() {
return key2Value.entries();
}
@Override
public Map<K, Collection<V>> asMap() {
return key2Value.asMap();
}
public static void main(String[] args) {
MyMap<String, String> map = new MyMap<>();
map.put("key1", "value1");
map.put("key1", "value2");
map.put("key1", "value3");
map.put("key1", "value4");
map.put("key2", "value5");
System.out.println(map.getKeyByValue("value1"));
System.out.println(map.getKeyByValue("value5"));
}
}
输出:
key1
key2
答案 1 :(得分:-3)
我想你可能需要这个类: org.apache.commons.collections.map.MultiValueMap
它是ASF commons-collections.jar,文档:http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/map/MultiValueMap.html