2017-01-03 1 views
-2

Как вычислить процент Vs в списке с правилами слюни. В случае, если процент V составляет 80%, тогда выполните огонь по слюням.Подсчет и группировка строк в Drools Expert 6.5 с накоплением или получением ключевого слова

У меня есть ArrayList, который будет иметь только два значения: V и N.

List<String> list = new ArrayList<>(); 

Как подсчитать количество V с правилами Drools, каждый V и N будет стоить 1, получить общую сумму сумма В и Н.

В Java

Map<String, Long> counted = list.stream() 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 
    System.out.println("Counted: "+counted); 

выражение выше отпечатков

Counted: {V=4, N=15}

После получения значений будет существовать выражение правила drols, которое в случае возникновения 80% появления счетчика V выводит «ok», иначе печать не допускается.

+0

Что вы хотите сказать? Кроме того, я не уверен, что вы подразумеваете под * «в среднем 80% появления V» *. – 4castle

+0

хорошо, спасибо за комментарий. Просто мне нужно получить среднее значение V, если оно равно 80, правило будет срабатывать и печатать ok – csstugfurher

+0

«V» - это строка. Что вы пытаетесь получить от этого? – 4castle

ответ

0

Вот правило, которое вычисляет процент Vs в списке:

rule "countVN" 
when 
    $vn: ArrayList($s: size) 
    accumulate(String(toString == "V") from $vn; 
       $cnt: count(1); 
       $cnt.doubleValue()/$s >= 0.8) 
then 
    System.out.println("80% or more"); 
end 

Это срабатывает только для> = 80% случае. Если вам нужен результат в любом случае, используйте

... 
    accumulate(String(toString == "V") from $vn; 
       $cnt: count(1)) 
then 
    if($cnt.doubleValue()/$s >= 0.8) ... 
+0

Привет, спасибо за ваш комментарий. Throws [Line: 50, Column: 4]], Message [id = 4, kieBase = kbase1, level = ERROR, path = rules.drl, line = 50, column = 0 text = Невозможно проанализировать выражение '$ cnt. doubleValue()/$ s '], Message [id = 5, kieBase = kbase1, level = ERROR, path = rules.drl, line = 50, column = 0 text = Невозможно проанализировать выражение $ cnt.doubleValue()/$ s> = 0.8: [Ошибка: не удалось разрешить метод с использованием строгого режима: java.lang.Object. $ s()] [Near: {... $ cnt.doubleValue()/$ s> = 0.8 ....}] ^ – csstugfurher

+0

Мое правило не генерирует исключения, я проверил его с помощью Drools 6.2. Пожалуйста, разместите полный текст правила, как он есть в вашем коде DRL, а не в комментарии; отредактируйте его в свой вопрос. – laune

+0

Я изменился; и все работает отлично в слюни 6.5 – csstugfurher