MultiValueMap类(Apache公用集合)可以很容易地处理值为集合的地图。我正在寻找一个类,它可以很容易地处理其键为对象且值为地图的地图。地图数据结构的地图
我使用Java 1.4,因此无法使用Google Collections或泛型。
MultiValueMap类(Apache公用集合)可以很容易地处理值为集合的地图。我正在寻找一个类,它可以很容易地处理其键为对象且值为地图的地图。地图数据结构的地图
我使用Java 1.4,因此无法使用Google Collections或泛型。
地图的地图实际上是一个没有单根节点的树型结构(以及地图的地图...)。
您可以看看Composite pattern,它被广泛用于实现树结构(如果它们的组件具有与我感觉不到的相同类型)。
另一种解决方案是实现一个简单的域模型。这将是更清晰阅读,易于维护是这样的:
school.getPupil ("John Doe").getMark ("Math")
比
school.get ("John Doe").get ("Math")
在常规地图收集工程这样的:
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);
通常人们不想拥有关心给定的(第一个)键是否已经在'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
如果您有map:{string,map:{string,thing}}
(故意而不是使用Java语法来避免整个Java1.4/Java5业务),那么您还应该考虑是否应该将其模型化为map:{tuple:{string,string},thing}
。如果多级查找占主导地位,那么这是一个很好的改变(假如你实施了一个好的tuple
,那么equals()
正确,hashCode()
是智能的),但是如果你做了很多插入和删除操作,那么它就不太好。
hashCode中的智能可能意味着只是想出一种合理的方式将内容的hashCodes中的位混合在一起。如果成员的价值观是来自不相交的集合(例如姓名和职业),那么你可以将它们异或 - 不完美但便宜且快速 - 但是如果你的控制/确定性较低,那么你需要做其他的事情(例如,旋转XOR之前的其中一个值的位)。
你需要哪一边是地图?你是从地图映射到对象,映射到对象还是映射到映射? – MikeD 2010-06-22 13:51:49
难道你不能只让地图<东西,地图>?或者你想能够做一些像map.put(key1,key2,value)的东西? – Dave 2010-06-22 13:53:32
我想,这并不是说它过于相关,但我很好奇:哪个公司/行业(特别是您可以轻松告诉我们的)仍然需要Java 1.4?即使Java 5已经终结了。 Java 1.4已经使用了将近2年了。 – 2010-06-22 13:53:35