访问地图地图的最佳方式

时间:2013-03-08 18:21:12

标签: java map

考虑以下情况:

我有一个地图,其中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;

这是解决这个问题的正确方法吗?我得到了未经检查的转换警告。有没有更好的方法呢?

1 个答案:

答案 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。

该实施的好处是:

  • 代码正确使用泛型并且数据是完全类型化的。这意味着您没有任何更通用的警告。
  • 在这个地图链中存储东西的所有逻辑都是在一些实用程序类中抽象出来的。

另一方面,缺点是填充地图可能有点复杂,但同样可以递归完成。