限制HashMap接受特定的字符串键

时间:2014-12-10 15:47:47

标签: java hashmap

我们如何限制HashMap接受特定的字符串键。
这里的限制可以具有以下含义之一 -
1。它可能会抛出错误或
2。它可以简单地忽略具有该特定密钥的条目。

但条件是它应该在不重写HashMap的put方法的情况下实现,并且在向给定映射添加条目时不使用if条件。

假设我有一个HashMap m ,我想限制一个特定的字符串键“myKey”。 我想要的是,每当我们尝试使用键“myKey”添加任何条目时,m应该遵循上面提到的第1点或第2点。

m.put("otherKey", "value"); // should add to the map<br/>
m.put("myKey","value"); // Either throw an error or ignore this entry and should not add to the map.

我可以使用Genetics限制一种键,但是如何为一个给定的字符串键限制它。这是一个面试问题。

提前致谢!!

5 个答案:

答案 0 :(得分:3)

您可以使用emun作为密钥。如

public enum AllowedKey {
    KEY_ONE,
    KEY_TWO; // etc
}

然后在地图中使用它:

Map<AllowedKey, String> map = new HashMap<>();
map.put("string", "value"); // compile error!
map.put(AllowedKey.KEY_ONE, "value"); // success!

如果你的实现允许,你也可以使用EnumMap。

编辑:无法更改HashMap的定义,因此这种方法将不再适用。

答案 1 :(得分:3)

这些是非常奇怪的限制......但是这里没有if声明或覆盖:

void addToMap(HashMap<String,Sting> map, String key, String value) {
    switch (key) {
        case "MyKey":
             throw new IllegalArgumentException(key);
        default: map.put(key, value);
    }
}

答案 2 :(得分:2)

您可以执行任何操作以避免明确键入if。使用switch的现有答案可以正常工作,就像使用while循环并在其中无条件地破坏或返回一样。如果你的面试官真的想知道如何编写令人不快的代码,那就是你的答案。

如果您对真正方法限制HashMap密钥感兴趣,则应使用Guava的ForwardingMap并扩展 { {1}}和.put*()方法,抛出IllegalArgumentExceptionif some property of the specified key or value prevents it from being stored in this map”。即使您不使用Guava,也应该直接decorator pattern而不是直接扩展.putAll() Effective Java:Item 16 )。

或者,您可能会发现为密钥使用专用类型更容易,例如:一个HashMap类进行消毒。然后,您可以创建RestrictedString并相信只有有效的密钥才会出现在地图中。这样可以避免在Map<RestrictedString, String>代码中使用条件(if / switch / etc。),而是将其移至Map类。

即使面试官提出一个益智游戏风格的问题,回答现实世界的解决方案(同时仍然承认他们的规定)只能为任何合法雇主提供积分。

答案 3 :(得分:1)

使用Set存储禁止的密钥。

然后在地图中映射true和false:

Set prohibitedKeys = new HashSet<String>();
prohibitedKeys.add("myKey");
Map<Boolean,Map<String,String>> boolMap = new HashMap<Boolean,Map<String,String>>();
Map<String,String> myMap = new HashMap<String,String>();

boolMap.put(Boolean.FALSE,myMap);
//This will work
Map m = boolMap.get((Boolean)prohibitedKeys.contains("otherKey"))
m.put("otherKey", "value");

//This will throw an null pointer exception
m.put("myKey", "value");

答案 4 :(得分:0)

EnumMap允许将键限制为静态子集,但显然会破坏Map<String, String>的要求。

使用装饰器,装饰器和装饰类通常共享一个接口,即Map,因此实现自定义put(k, v)并将所有其他方法传递给装饰的HashMap可能是可以接受的,因为您没有直接覆盖{ {1}} HashMap的方法。

我能想到的唯一其他解决方案是使用基于AOP的解决方案对put(k,v)方法应用'before'建议,并拒绝任何无效值。