YAML每个元素具有多个值的多个键

时间:2015-10-09 19:43:17

标签: java yaml

在YAML中,我有一个类似于下面的结构,它将在Java中反序列化并解析:

events:
  - causes:
    - CAUSE_ONE
    - CAUSE_TWO
    effects:
    - EFFECT_ONE
    - EFFECT_TWO
  - causes:
    - CAUSE_THREE
    effects:
    - EFFECT_THREE

这会转换为一个地图数组,其中每个地图包含两个键 - causeseffects,这些键的值是一个字符串数组。我试图实现的是单个对象有一个或多个事件。每个事件由一个或多个触发一个或多个效果的原因组成。在上面的示例中,当满足CAUSE_ONECAUSE_TWO条件时,会触发EFFECT_ONEEFFECT_TWO。如果符合CAUSE_THREE条件,则会触发EFFECT_THREE

在Java中,这可能是Map<String, String>[]List<Map<String, String>>。成功满足causes条目中的所有条件后,effects条目中的每个效果都将启动。

我希望能够在Java中反序列化YAML数据,以便单个对象可以拥有许多事件,当满足一系列条件(原因)时,会触发相应的效果。是否有更好的方法来构建上面的YAML,或者我可以在不使用地图数组的情况下实现这一目标?

1 个答案:

答案 0 :(得分:1)

根据具体情况,列表效率低下。如果您可以计算适用于某个输入的CAUSES,则必须遍历事件列表以查找匹配项。在这种情况下,您最好使用:

events: 
    [CAUSE_ONE, CAUSE_TWO]:
      - EFFECT_ONE
      - EFFECT_TWO
    [CAUSE_THREE]:
      - EFFECT_THREE

您可以使用计算出的CAUSES来查找效果。这是有效的YAML,但依赖于解析器/语言组合,能够将序列作为表示特定语言¹中映射的键。

如果你无法预先计算,你必须检查所有事件,因为可以应用多个事件,这个映射可以与列表相比。

只有在您无法根据输入预先确定任何CAUSES的情况下,如果您在找到匹配时可以提前退出,则有一个列表(并根据预期输入对其进行排序)是有意义的。在所有其他情况下,某种类型的映射(甚至是事件列表的块)对于除了小数量之外的所有数据都会更有效(因为计算映射的散列并进行查找比走列表和执行更有效可能还有更多的支票)

¹我不熟悉JAVA解析器以及它们的兼容性。对于Python,PyYAML cannot handle this,但ruamel.yaml(我是作者)可以。