整点发放优惠券怎么做?必须用到这个谷歌Map神器

简介: 11月的双十一,12月的双十二,打折不断,优惠不停。电商系统中发放优惠券,是一个比较常见的功能。今天讲一个优惠券开发实战。

上个月的双十一,这月的双十二,打折不断,优惠不停。电商系统中发放优惠券,是一个比较常见的功能。今天讲一个优惠券开发实战。



🍊需求

现在有一个需求,实现不同时间段发放不同优惠券,比如11.11日凌晨0~12点之间发放7折优惠券,12~18点之间发放8折优惠券,18~24点之间发放9折优惠券。

作为开发老油条,你会选用什么数据结构发放优惠券呢?


🍎功能分析

首选明确,这个需求里面有个区间概念,整理如下:

开始时间(含) 结束时间(不含) 优惠券
0 12 7折
12 18 8折
18 24 9折

数学表达:

[0, 12) ==> 7折

[12, 18) ==> 8折

[18, 12) ==> 9折


🍒数据结构选择

使用TreeMap

/**  * the RangeTest * @author Java实用技术手册  * @date 2022-12-17  */publicclassRangeTest {  
privatestaticMap<Integer, String>discountMap=newTreeMap<>();  
publicstaticvoidmain(String[] args) {  
initDiscountMap();  
System.out.println("getDiscount_11="+getDiscount(11));  
System.out.println("getDiscount_12="+getDiscount(12));  
    }  
publicstaticvoidinitDiscountMap() {  
discountMap.put(0, Discount.DISCOUNT_7);  
discountMap.put(12, Discount.DISCOUNT_8);  
discountMap.put(18, Discount.DISCOUNT_9);  
    }  
publicstaticDiscountgetDiscount(Integertime) {  
Objects.requireNonNull(time);  
if (time>=0&&time<12) {  
returndiscountMap.get(0);  
        } elseif (time>=12&&time<18) {  
returndiscountMap.get(12);  
        } elseif (time>=18&&time<24) {  
returndiscountMap.get(18);  
        }  
returnnull;  
    }
}

大致思路就是使用TreeMap分段设置,查找的时候,比较当前时间处于哪个区间,然后返回对应的value。

上面的代码包括initDiscountMapgetDiscount方法,可以看出如果要新增一个时间区间的优惠券,需同时修改这2个方法,违反了代码开闭原则。


使用Guava的TreeRangeMap

之前我们说谷歌神器Guava工具类的时候,提到过多种骚气的Map,其中TreeRangeMap就是一个为区间Map。

当前POM依赖

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency>

TreeRangeMap描述的是“不相交且非空的区间”到特定值的映射。

内部存储完美符合上面的数学表达式。

[0, 12) ==> 7折

[12, 18) ==> 8折

[18, 12) ==> 9折


使用方法: 先使用TreeRangeMap.create()创建RangeMap,然后put数据。

key=Range(),value=折扣值。

其中:Range有多个方法,注意根据需求使用。

方法 左边 右边 数学表达
open (a, b)
closed [a, b]
closedOpen [a, b)
openClosed (a, b]
/**  * the RangeTest * @author Java实用技术手册  * @date 2022-12-17  */publicclassRangeTest {  
privatestaticRangeMap<Integer, Discount>rangeMap=TreeRangeMap.create();  
publicstaticvoidmain(String[] args) {  
initDiscountMapGuava();  
System.out.println("getDiscountGuava_11="+getDiscountGuava(11));  
System.out.println("getDiscountGuava_12="+getDiscountGuava(12));  
    } 
/**  * 初始化RangeMap,注意key的区间开闭性。  */publicstaticvoidinitDiscountMapGuava() {  
rangeMap.put(Range.closedOpen(0, 12), Discount.DISCOUNT_7);  
rangeMap.put(Range.closedOpen(12, 18), Discount.DISCOUNT_8);  
rangeMap.put(Range.closedOpen(18, 24), Discount.DISCOUNT_9);  
    }  
publicstaticDiscountgetDiscountGuava(Integertime) {  
returnrangeMap.get(Objects.requireNonNull(time));  
    }
}

使用RangeMap后,新增一个时间区间优惠券,只要在初始化方法中增加一行数据,而且key的Range设计也比较符合人文理解。

对RangeMap的遍历,可以使用 Map<Range<K>, V> TreeRangeMap#asMapOfRanges()方法。

以上就是本期内容,希望对你有帮助。


我是Pandas,专注Java编程实用技术分享,公众号《Java实用技术手册》和B站均有视频解说,欢迎来玩。

如果你觉得这篇文章有用,别忘了点赞+关注,一起进步!

相关文章
|
2天前
|
Web App开发 数据采集 自然语言处理
python脚本抢各大平台大额优惠卷
python脚本抢各大平台大额优惠卷
57 0
|
8月前
|
小程序
二二复制的七人拼团系统 | 拼团返红包商城模型系统小程序定制开发部署
留意拼团系统的小伙伴应该注意到,最近有款新拼团模式很受欢迎。它就是结合拼团和二二复制的七人拼团系统,设置了直推和间推奖励,有效促进用户主动积极裂变和团队平台引流提升销量的效果。平台还具有帮扶互助、自动轮回复投,循环不断等特点,增加用户粘度和提高商品复购率。
|
2天前
|
存储 JSON API
如何教会小白使用淘宝API接口获取商品数据
随着互联网的普及,越来越多的人开始接触网络购物,而淘宝作为中国最大的电商平台之一,成为了众多消费者首选的购物平台。然而,对于一些小白用户来说,如何通过淘宝API接口获取商品数据可能是一个难题。本文将详细介绍如何教会小白使用淘宝API接口获取商品数据。
|
2天前
|
新零售 人工智能 供应链
排队免单返利商城系统开发|成熟源码部署|案例详情
新零售业是零售业发展的重要趋势,它通过技术的创新和变革,重新定义了传统零售业的模式和方式
|
9月前
网上平台提现被拒客服以各种理由不给出应该怎么办?
网上被黑可能是你遇到黑平台才会导致的,遇到事情不要慌一下文章可能帮你换回损失
134 1
网上平台提现被拒客服以各种理由不给出应该怎么办?
|
缓存 算法 搜索推荐
618省心凑背后的新算法——个性化凑单商品打包购推荐
作为购物导购链路的一个重要环节,凑单旨在快速帮助用户找到达成某个满减门槛(比如满300减50)的商品,完成性价比最高的跨店组合结算。
580 0
618省心凑背后的新算法——个性化凑单商品打包购推荐
|
定位技术
如何利用外贸新方法,让你订单接到手软?
是否苦恼过如何在外贸领域做得更好? 是否曾经跟进了很久的客户,却无法让他们下订单? 是否经常遇到发送出去的邮件毫无回应的情况? 是否觉得明明很努力,但业绩总是不理想?
95 0
如何利用外贸新方法,让你订单接到手软?
|
Java 应用服务中间件 数据库
电商促销后台设计,写得太好了!
电商促销后台设计,写得太好了!
252 0
电商促销后台设计,写得太好了!
|
移动开发 监控 安全
第十一期 | 你抢不到的优惠券,背后“元凶”竟是垃圾注册?
顶象防御云业务安全情报中心发现,某电商平台注册场景出现大批量异常注册。黑产通过批量注册获得大量平台账号,为其后续在电商平台大促期间开展批量抢券、秒杀、刷单等行为进行账号储备。
145 0
第十一期 | 你抢不到的优惠券,背后“元凶”竟是垃圾注册?
|
数据安全/隐私保护 UED
任务悬赏源码,不可或缺的重要功能之充值提现
任务悬赏源码,不可或缺的重要功能之充值提现