2015-10-09 23 views
2

多個值在YAML多個密鑰,我具有類似於下面的一個,這是在Java中進行反序列化和分析的結構:YAML每個元件

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,或者我可以在不使用地圖數組的情況下實現這一點?

+0

@Anthon我修改了我的問題,以提供更多關於我所問的內容。 – driima

回答

1

根據具體情況,列表效率不高。如果您可以計算適用於某個輸入的CAUSES,則必須遍歷事件列表才能找到匹配項。在這種情況下,您最好是:

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

其中您使用計算的CAUSES來查找效果。這是有效的YAML,但依賴於解析器/語言組合來能夠處理序列作爲以特定語言¹表示映射的鍵。

如果無法預先計算並且必須檢查所有事件,因爲可以應用多個事件,則此映射與列表相當。

只有在您無法基於輸入預先確定任何原因以及如果您可以在找到匹配時提前退出的情況下,有一個列表(並根據預期輸入進行排序)是有意義的。在所有其他情況下,某種排序(甚至是事件列表塊)的映射對於除小數字之外的所有映射都將更有效(因爲計算映射的散列值並執行查找比行走列表和做可能更多的檢查)


¹我不熟悉Java語法分析器,以及如何順應他們。對於Python PyYAML cannot handle this,但ruamel.yaml(我是作者)可以。

+0

幸運的是,SnakeYAML成功解析了它。這使我的YAML結構更好,我可以從這裏工作。謝謝! – driima