是否可以创建一个每个键都指向相同值的映射?
Is it possible to create a Map where every Key points to the same Value?
是否可以(在 Java 中)创建一个 Map,无论我要搜索哪个键,我都会检索到相同的值?我们可以假设密钥的数量是有限的或无限的。
我考虑过大小为 1 且加载因子为 1.0 的映射,其中存储了该值,但我几乎肯定 hashmap 实现将识别冲突,并且 return 无论如何都是 null。
我也接受了这样的可能性,如果我为一个变量创建我自己的散列函数,或者甚至是一个实现 Map 的新数据类型,我应该能够做到这一点,但它可能有点混乱。也许不是?
当然,简单地将值映射到每个键是非常低效的(除非有一个内置的方法,我忽略了这一点),而且远没有听到 SO 的答案那么有趣。
我不太确定你在这里想要完成什么,但你需要做的就是实施 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;
}
}
我认为使用现有 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
。
,您可能会记住这一点
我不确定您要完成什么,我想具有默认值的 Map 应该适合您。这是非常标准的模式。
您可以使用 apache commons DefaultedMap 实现
在Java8中,可以使用Map.getOrDefault
您始终可以实现自己的
HashMap to return default value for non-found keys?
是否可以(在 Java 中)创建一个 Map,无论我要搜索哪个键,我都会检索到相同的值?我们可以假设密钥的数量是有限的或无限的。
我考虑过大小为 1 且加载因子为 1.0 的映射,其中存储了该值,但我几乎肯定 hashmap 实现将识别冲突,并且 return 无论如何都是 null。
我也接受了这样的可能性,如果我为一个变量创建我自己的散列函数,或者甚至是一个实现 Map 的新数据类型,我应该能够做到这一点,但它可能有点混乱。也许不是?
当然,简单地将值映射到每个键是非常低效的(除非有一个内置的方法,我忽略了这一点),而且远没有听到 SO 的答案那么有趣。
我不太确定你在这里想要完成什么,但你需要做的就是实施 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;
}
}
我认为使用现有 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
。
我不确定您要完成什么,我想具有默认值的 Map 应该适合您。这是非常标准的模式。
您可以使用 apache commons DefaultedMap 实现
在Java8中,可以使用Map.getOrDefault
您始终可以实现自己的
HashMap to return default value for non-found keys?