考虑以下情况:
我有一个地图,其中String作为键,另一个Map作为值。现在,值中的Map也是一个Map,其中String为键,Map为value。我们有这样的n个级别,最终级别有一个Map,其中String作为键,String作为值。现在假设,我有每个级别的键列表。我必须得到最终的String值。
这就是我想在java中实现它的方法:
Object q = initialMap;
for(String key : keyList)
{
Map x = (Map)q;
q = x.get(key);
}
return (String)q;
这是解决这个问题的正确方法吗?我得到了未经检查的转换警告。有没有更好的方法呢?
答案 0 :(得分:1)
我想我理解你的问题,你从一个文件中获取一个字符串的Map to Map of Map to Map of ...等等:
Map<String, Map<String, Map<String, Map<String, String>>>> initialMap;
你的问题中不清楚的是你知道会有多少级别的地图。如果是,那么就像我刚才所做的那样(对于4级地图)编写初始地图,以获得所需的级别数。
如果你不知道你有多少级别,那么它就更难了。在这种情况下,您的算法是合理的。我只会这样做更多的泛型:
Object q = initialMap;
for(String key : keyList)
{
Map<String, ?> x = (Map<String, ?>)q;
q = x.get(key);
}
return (String)q;
但是这总会给你一个警告,你必须通过在方法中添加@SuppressWarnings(“unchecked”)来抑制。
您可以尝试在方法中抽象出来。
编辑:有一种方法可以在实用程序类中完全抽象它。我会打电话给你想要一种递归的地图。您的任何Map都是从String到String的映射或映射到String到递归映射。这可以通过这种方式抽象出来:
interface IRecursiveMap {
String get(List<String> keyList);
}
class RecursiveMap implements IRecursiveMap{
Map<String, IRecursiveMap> map;
@Override
public String get(List<String> keyList) {
String key = keyList.get(0);
return map.get(key).get(keyList.subList(1, keyList.size()));
}
}
class ValueMap implements IRecursiveMap{
Map<String, String> map;
@Override
public String get(List<String> keyList) {
String key = keyList.get(0);
return map.get(key);
}
}
所以IRecursiveMap是定义地图常见行为的界面:从键列表中获取内容的能力。 RecursiveMap是将String映射到另一个IRecursiveMap的实现,而ValueMap是递归的最后一个映射,它实际上将String映射到String。
该实施的好处是:
另一方面,缺点是填充地图可能有点复杂,但同样可以递归完成。