我们如何限制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限制一种键,但是如何为一个给定的字符串键限制它。这是一个面试问题。
提前致谢!!
答案 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*()
方法,抛出IllegalArgumentException
“if 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'建议,并拒绝任何无效值。