drools - 获取集合中项目的索引

时间:2014-07-30 08:33:33

标签: drools

我有一个餐厅应用程序,并且有一个规则,每第二个冰淇淋需要提供20%的折扣。

所以,

  • 如果账单上有2个冰淇淋,第二个冰淇淋可享受20%的折扣
  • 如果法案有3个冰淇淋,第二个冰淇淋仍然可以享受20%的折扣
  • 如果法案有4个冰淇淋,第2和第4个冰淇淋可享受20%的折扣

我有一个名为$ bill.items的集合,其中包含账单中的每个单独项目。

我如何在Drools中编写此规则,因为似乎无法访问集合中元素的索引。

1 个答案:

答案 0 :(得分:1)

只需收集它们并在右侧应用折扣:

rule "Discount multiple ice creams"
when
    $bill : Bill()
    $iceCreams : ArrayList( size > 1 ) from $bill.items
then
    for (int i = 0; i < $iceCreams.size(); i++) {
        if (i % 2 == 0) {
            // Apply a discount
        }
    }
end

或者如果每个账单项目在工作记忆中可用,则可以在LHS上使用以下项目来收集它们:

$iceCreams : ArrayList( size > 1 )
             from collect( BillItem(type == "Ice Cream") )

您可能需要根据帐单中的每个项目索引对您收集的列表进行重新排序。

虽然单个账单上的项目顺序真的重要吗?在账单上输入商品的顺序是折扣的一个相当不寻常的基础。当顾客购买2块不同价格的冰淇淋时,我会首先要求最便宜的商品,因为我会在第二块冰淇淋上获得更大的折扣。因此,为什么这种折扣通常适用于N个最便宜的物品。即如果购买了4种冰淇淋,则最便宜的2种可以打折。还有,冰淇淋价格不同吗?如果每个冰淇淋价格相同,那么你真正需要知道的是需要打折的价格。