Maps 数据结构图
Posted
技术标签:
【中文标题】Maps 数据结构图【英文标题】:Map of Maps data structure 【发布时间】:2011-03-06 20:12:50 【问题描述】:MultiValueMap 类(Apache commons 集合)使使用值为 Collections 的 Map 变得容易。我正在寻找一个类,它可以轻松使用其键是对象而值是 Maps 的 Map。
我使用的是 Java 1.4,所以不能使用 Google 集合或泛型。
【问题讨论】:
需要哪一边做地图?您是在映射到对象、对象到映射还是映射到映射? 你不能制作地图地图地图实际上是一个没有单个根节点的树型结构(以及地图地图......)。
您可以查看广泛用于实现树结构的Composite pattern(如果它们的组件具有相同的类型,而我认为不是这种情况)。
另一个解决方案是实现一个简单的域模型。它会更清晰易读且易于维护,例如:
school.getPupil ("John Doe").getMark ("Math")
比
school.get ("John Doe").get ("Math")
【讨论】:
【参考方案2】:常规地图集合适用于此:
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);
事实上,如果你不担心类型安全,你可以将任何你想要的东西放入 value 部分:
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);
【讨论】:
通常人们不想关心给定的(第一个)密钥是否已经在mapOfMaps
中,例如做mapOfMaps.get("firstKey").put("secondKey",value)
的时候。例如,Python 的地图为此目的有一个setdefault
method。【参考方案3】:
如果您有一个map:string,map:string,thing
(故意不使用 Java 语法来避免整个 Java1.4/Java5 业务),那么您还应该考虑是否应该将其建模为 @987654322 @。如果多级查找占主导地位,那么这是一个很好的改变(前提是你实现了一个好的tuple
,它正确地执行了equals()
,并且智能地执行了hashCode()
)但是如果你做了很多插入和删除,那么它就不那么好了.
hashCode 中的智能可能意味着只是想出一种合理的方法来将内容的 hashCode 中的位混合在一起。如果成员值预计来自不相交的集合(例如,姓名和职业),那么您可以将它们异或在一起 - 不完美,但便宜且快速 - 但如果您的控制/确定性较少,那么您需要做其他事情作为好(例如,在 XOR 之前旋转其中一个值的位)。
【讨论】:
以上是关于Maps 数据结构图的主要内容,如果未能解决你的问题,请参考以下文章
Google Location API vs. Maps:为啥相同的查询会产生不同的结果?
Go 语言入门很简单 -- 8. Go Maps #私藏项目实操分享#