2010-06-22 57 views
9

MultiValueMap类(Apache公用集合)可以很容易地处理值为集合的地图。我正在寻找一个类,它可以很容易地处理其键为对象且值为地图的地图。地图数据结构的地图

我使用Java 1.4,因此无法使用Google Collections或泛型。

+0

你需要哪一边是地图?你是从地图映射到对象,映射到对象还是映射到映射? – MikeD 2010-06-22 13:51:49

+0

难道你不能只让地图<东西,地图>?或者你想能够做一些像map.put(key1,key2,value)的东西? – Dave 2010-06-22 13:53:32

+0

我想,这并不是说它过于相关,但我很好奇:哪个公司/行业(特别是您可以轻松告诉我们的)仍然需要Java 1.4?即使Java 5已经终结了。 Java 1.4已经使用了将近2年了。 – 2010-06-22 13:53:35

回答

7

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

您可以看看Composite pattern,它被广泛用于实现树结构(如果它们的组件具有与我感觉不到的相同类型)。

另一种解决方案是实现一个简单的域模型。这将是更清晰阅读,易于维护是这样的:

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

school.get ("John Doe").get ("Math") 
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); 
+0

通常人们不想拥有关心给定的(第一个)键是否已经在'mapOfMaps'中,例如当做'mapOfMaps.get(“firstKey”)。put(“secondKey”,value)'。例如,Python的地图为此设置了一个['setdefault'方法](http://docs.python.org/2/library/stdtypes.html#dict.setdefault)。 – 2013-07-17 12:30:10

1

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

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