【问题标题】:DataStructure for implementing something like nested Maps?用于实现嵌套地图之类的数据结构?
【发布时间】:2011-10-12 09:44:11
【问题描述】:

我想要一张允许树状行为的地图。我希望能够定义一个从字符串到对象的映射,它可以是另一个映射,也可以是一个字符串:

    Map<String,(String OR Map)>

我认为我知道如何做到这一点的唯一方法是通过访问者模式。是否有已经实现的数据结构?

更新: 这是上下文: 我想解析通过发布请求提交的表单。表单是多级的,可以有任意数量的字段(由用户选择)。我决定做的是用数字命名表单中的字段:

  1. 用户|名称
  2. 处理器|1|速度
  3. 处理器|1!name
  4. 处理器|2|速度
  5. 磁盘|1|名称
  6. 磁盘|2|名称

我决定在 | 分手然后创建一个类似树的结构,它看起来像这样:

  • 用户
    • name = 用户输入的任何内容
  • 处理器
    • 1
      • 速度 = 用户输入的任何内容
      • name = 用户输入的任何内容
    • 2
      • 速度 = 用户输入的任何内容
  • 磁盘
    • 1
      • name = 用户输入的任何内容
    • 2
      • name = 用户输入的任何内容

只有最后的叶子会包含字符串。没有那么多字段,所以我觉得使用地图可能有点矫枉过正,但老实说,我真的不知道如何使用其他任何东西。

【问题讨论】:

    标签: java design-patterns data-structures map visitor-pattern


    【解决方案1】:

    Google Collections 有一个非常好的 API MultiMap 用于这个用例

    【讨论】:

      【解决方案2】:

      引入一个表示StringMap 的对象。大概您以具有某些共同行为的方式使用它们?这可以抽象为一个通用的基类,听起来有点像composite pattern(树状行为)。例如:

      interface StructuredObject {}
      
      class Leaf implements StructuredObject {}
      
      class Composite implements StructuredObject {}
      
      Map<String, StructuredObject> map = ...;
      

      正如您所指出的,您可以使用访问者模式遍历地图并避免类型转换。

      【讨论】:

      • 我的问题是如何实现访问集合中的命名元素。我的接口有以下方法 getElem() 在键处返回接口,getVal() 返回 String 和 putElem() 插入接口。我将如何处理来自叶子的 getElem 调用?只返回null?同样,我将如何处理复合材料中的 getVal?
      • 你可以让 Leaf 表现得像没有孩子的复合材料吗? (有点像空对象)。 getVal 同上(但反过来)。不过我不确定上下文,所以也许我误解了。
      • 我在问题中添加了一些上下文。
      • 我会给StructuredObject 一个方法String getElement(String... keys)Leaf 将通过返回其单个存储的字符串来实现这一点,而Composite 将通过在数组,找到对应的子元素,用数组的剩余部分调用它的getElement 方法,并返回结果。两个类都会检查数组的长度是否正确:对于Leaf,数组的长度必须为0,对于Composite,它的长度必须>0。不正确的长度会得到IllegalArgumentException。因此,客户端永远不必在树中导航。
      • 你可能想要一个List而不是一个数组,真的,因为你可以有效地做subList,而不必在整个地方对数组进行切片和切块。
      【解决方案3】:

      大多数地图实现都有特定类型的值。如果您想要多种值类型,您可以通过包装您选择的地图来做到这一点,例如树状图。

      【讨论】:

        猜你喜欢
        • 2011-09-27
        • 1970-01-01
        • 2012-08-27
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-15
        相关资源
        最近更新 更多