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 集合或泛型。

【问题讨论】:

需要哪一边做地图?您是在映射到对象、对象到映射还是映射到映射? 你不能制作地图吗?或者您希望能够执行类似 map.put(key1, key2, value) 的操作? 我想这并不是说它过于相关,但我很好奇:哪个公司/行业(具体如您所说的那样)仍然需要 Java 1.4?甚至 Java 5 也已报废。 Java 1.4 已经 EOLd 将近 2 年了。 @Dave Java 1.4 没有泛型(至少不是标准发行版;我知道在泛型成为 Java 5 规范的一部分之前,有某种 JSR 用于测试泛型) )。 @Hank Gay 我知道至少有一家制药公司仍在使用 Java 1.4。 【参考方案1】:

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

您可以查看广泛用于实现树结构的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 数据结构图的主要内容,如果未能解决你的问题,请参考以下文章

golang maps 预留多少内存?

Google Location API vs. Maps:为啥相同的查询会产生不同的结果?

ES6 Maps and Sets:如何有效地索引对象键?

Go 语言入门很简单 -- 8. Go Maps #私藏项目实操分享#

使用pygal_maps_world.i18n中数据画各大洲地图

1125937650