MultiValueMap类(Apache commons集合)可以轻松使用值为Collections的Map。我正在寻找一个可以轻松使用Map的类,它的键是对象,值是Maps。
我使用的是Java 1.4,因此无法使用Google Collections或generics。
答案 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的位混合在一起。如果成员值预期来自不相交的集合(例如,名称和职业),那么你可以将它们混合在一起 - 不完美,但便宜又快 - 但如果你的控制/确定性较低,那么你需要做其他的事情。好(例如,在异或之前旋转其中一个值的位)。