地图数据结构地图

MultiValueMap类(Apache commons集合)使得使用值为Collections的Map变得容易。 我正在寻找一个类,它可以很容易地使用Map,其键是对象,值是Maps。

我正在使用Java 1.4,因此无法使用Google Collections或generics。

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

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

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

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

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

常规Map集合适用于此:

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

事实上,如果您不担心类型安全,可以将任何您想要的东西放入值部分:

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

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

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