是否有可能(在Java中)创建一个Map,无论我要搜索哪个键,我都会检索相同的值?我们可以假设有限或无限量的密钥。
我考虑了一个大小为1且加载因子为1.0的映射,其中存储了该值,但我几乎肯定了hashmap实现将识别碰撞,并且无论如何都返回null。
我还认识到如果我为变量创建自己的哈希函数,甚至是实现Map的新数据类型,我应该能够做到这一点,但它可能有点混乱。也许不是吗?
当然,简单地将值映射到每个单独的键是非常低效的(除非有一个内置的方法,我忽略了),并且远没有听到SO的答案那么有趣。
答案 0 :(得分:4)
我认为使用现有API执行此操作的最合理方法如下:
// Java 6/7
new TreeMap<K, V>(new Comparator<K>() {
@Override
public int compare(K lhs, K rhs) {
return 0;
}
});
// Java 8+
new TreeMap<K, V>((a, b) -> 0);
这个TreeMap
认为所有键都相等,否则将保持相当好的Map语义。
请注意,除非您remove
,否则您在地图中输入的第一个键将永久保留在其中。
即
m.put("abc", "123");
m.put("def", "456");
// prints something like {abc=456}
System.out.println(m);
因此,如果您计划检查entrySet
。
答案 1 :(得分:1)
我不太确定你要在这里完成什么,但你需要做的就是实施 Map。一个例子:
import java.util.Collection;
import java.util.Map;
import java.util.Set;
public class ImmutableMap<K, V> implements Map<K, V> {
private final V immutableValue;
public ImmutableMap(final V immutableValue) {
this.immutableValue = immutableValue;
}
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean containsKey(Object key) {
return false;
}
@Override
public boolean containsValue(Object value) {
if (value == immutableValue)
return true;
return false;
}
@Override
public V get(Object key) {
return immutableValue;
}
@Override
public V put(K key, V value) {
throw new UnsupportedOperationException();
}
@Override
public V remove(Object key) {
throw new UnsupportedOperationException();
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
throw new UnsupportedOperationException();
}
/**
* Below are some unnecessary methods for the purpose of this class.
* You may decide their action.
*/
@Override
public Set<K> keySet() {
return null;
}
@Override
public Collection<V> values() {
return null;
}
@Override
public Set<java.util.Map.Entry<K, V>> entrySet() {
return null;
}
}
答案 2 :(得分:0)
我不确定你要完成什么,我猜使用默认值的Map应该适合你。这是非常标准的模式。
您可以使用apache commons DefaultedMap implementation
在Java 8中,您可以使用Map.getOrDefault
您可以随时实施自己的