地图数据结构地图

时间:2010-06-22 13:48:48

标签: java data-structures collections

MultiValueMap类(Apache commons集合)可以轻松使用值为Collections的Map。我正在寻找一个可以轻松使用Map的类,它的键是对象,值是Maps。

我使用的是Java 1.4,因此无法使用Google Collections或generics。

3 个答案:

答案 0 :(得分:7)

地图地图实际上是一个没有单根节点的树型结构(以及地图地图的地图......)。

您可以查看广泛用于实现树结构的Composite pattern(如果它们的组件具有相同的类型,而不是我认为的情况)。

另一个解决方案是实现一个简单的域模型。阅读起来会更加清晰,并且易于维护:

school.getPupil ("John Doe").getMark ("Math")

大于

school.get ("John Doe").get ("Math")

答案 1 :(得分:4)

常规地图集合适用于此:

    Map<Object,Map<Object,Object>> mapOfMaps = new LinkedHashMap<Object,Map<Object,Object>>();
    Object newObject = new String("object as string");
    mapOfMaps.put(newObject, new LinkedHashMap<Object,Object>());
    Map<Object,Object> objectMap = mapOfMaps.get(newObject);

事实上,如果你不担心类型安全,你可以把你想要的任何东西放到价值部分:

    Map<Object,Object> mapOfWhatever = new LinkedHashMap<Object,Object>();
    Object newObject = new String("object as string");
    mapOfWhatever.put(newObject, new LinkedHashMap<Object,Object>());
    Map<Object,Object> objectMap = (Map<Object, Object>) mapOfWhatever.get(newObject);

答案 2 :(得分:1)

如果您有一个map:{string,map:{string,thing}}(故意使用Java语法来避免整个Java1.4 / Java5业务),那么您还应该考虑是否应该将其建模为map:{tuple:{string,string},thing}。如果多级查找占主导地位,那么这是一个很好的改变(前提是你实现了一个正确tuple并且equals()智能化的好hashCode()但是如果你做了很多插入并删除然后它不太好。

hashCode中的智能可能意味着想出一种合理的方法将来自内容的hashCodes的位混合在一起。如果成员值预期来自不相交的集合(例如,名称和职业),那么你可以将它们混合在一起 - 不完美,但便宜又快 - 但如果你的控制/确定性较低,那么你需要做其他的事情。好(例如,在异或之前旋转其中一个值的位)。