【问题标题】:Map of Maps data structureMaps 数据结构图
【发布时间】: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。

标签: java data-structures collections


【解决方案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 之前旋转其中一个值的位)。

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2021-10-22
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2011-02-20
      相关资源
      最近更新 更多