如何用J语言单表达式实现多条件折扣计算?
多条件折扣计算的J语言实现
给定数据
price=:20 ages=:12 18 15 9 35 41 25 37 62 23 68 34
折扣规则
- 18岁以下:享20%折扣(支付原价80%)
- 18≤年龄<40:享15%折扣(支付原价85%)
- 40≤年龄≤65:无折扣(支付原价100%)
- 年龄>65:原规则未明确,此处默认无折扣
问题背景
用户尝试用J语言的幂连词^:实现单条件折扣(如18岁以下享25%折扣时写法:(*&0.75)^:(18 > ages) price),但需要处理多条件场景,询问是否能用逻辑表达式实现。
解决方案
完全可以用逻辑表达式实现,核心是为每个年龄生成对应的折扣乘数,再与原价相乘。J中布尔值会被解析为1/0,刚好可以用来筛选对应条件的乘数:
单个表达式实现
price * (0.8 * (ages < 18) + 0.85 * (18 <= ages) * (ages < 40) + 1.0 * (40 <= ages) * (ages <= 65) + 1.0 * (ages > 65))
逻辑说明
- 每个条件生成一个布尔数组,符合条件的位置为1,其余为0
- 用布尔数组乘以对应折扣乘数,再把所有项相加:每个年龄只会命中其中一个条件,最终得到该年龄的实际支付比例
- 最后乘以原价
price,得到每个人的应付金额
运行结果
执行上述表达式后,得到的应付金额数组为:
16 17 16 16 17 20 17 17 20 17 20 17
完全匹配折扣规则。
另一种简化写法(使用选择器)
如果偏好更简洁的结构,可以用{选择器先定义乘数列表,再生成索引:
price * (0.8 0.85 1.0 1.0) { (ages < 18) + 2*(18<=ages)*(ages<40) + 3*(40<=ages)*(ages<=65) +4*(ages>65)
不过第一种逻辑表达式的写法与规则对应更直接,可读性更强。
内容的提问来源于stack exchange,提问作者user3234709
相关产品推荐
相关产品推荐

