2015-10-09 1 views
2

В YAML, у меня есть структуру, аналогичную приведенной ниже, который должен быть десериализации в Java и синтаксический анализ:YAML несколько ключей с несколькими значениями одного элемента

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

Это переводит в массив карт, где каждая карта содержит два ключа - causes и effects, а значение этих ключей - это массив строк. Я пытаюсь добиться того, чтобы один объект имел одно или несколько событий. Каждое событие состоит из одной или нескольких причин, которые вызывают один или несколько эффектов. В приведенном выше примере, когда выполняются условия CAUSE_ONE и CAUSE_TWO, запускаютсяи EFFECT_TWO. Когда выполняется условие CAUSE_THREE, запускается EFFECT_THREE.

В Java это будет либо Map<String, String>[], либо List<Map<String, String>>. Когда все условия в записи causes успешно выполнены, каждый эффект в записи effects инициируется.

Я хочу, чтобы десериализовать данные YAML в Java, чтобы один объект мог иметь несколько событий, которые при выполнении ряда условий (причин) запускаются соответствующие эффекты. Есть ли лучший способ структурирования YAML выше или способ, которым я могу достичь этого, не используя массив карт?

+0

@ Антон я изменил свой вопрос, чтобы предоставить более подробную информацию о том, что я прошу. – 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

Смежные вопросы