整点发放优惠券怎么做?必须用到这个谷歌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站均有视频解说,欢迎来玩。

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

相关文章
|
6月前
|
JavaScript 前端开发 Java
网上积分兑换商城的设计与实现(论文+源码)_kaic
网上积分兑换商城的设计与实现(论文+源码)_kaic
网上平台提现被拒客服以各种理由不给出应该怎么办?
网上被黑可能是你遇到黑平台才会导致的,遇到事情不要慌一下文章可能帮你换回损失
159 1
网上平台提现被拒客服以各种理由不给出应该怎么办?
|
缓存 算法 搜索推荐
618省心凑背后的新算法——个性化凑单商品打包购推荐
作为购物导购链路的一个重要环节,凑单旨在快速帮助用户找到达成某个满减门槛(比如满300减50)的商品,完成性价比最高的跨店组合结算。
755 0
618省心凑背后的新算法——个性化凑单商品打包购推荐
|
Java 应用服务中间件 数据库
电商促销后台设计,写得太好了!
电商促销后台设计,写得太好了!
304 0
电商促销后台设计,写得太好了!
阿云漫画 | 淘宝“2021年度十大商品”,你get过几件?
编者按: 2021年还有29小时30分钟就要结束了,该用什么记录这一年?继各大平台陆续发布年度关键词、热搜、弹幕之后,国民电商平台淘宝也发布了一份特殊的年度榜单。网友看完表示,“这一年的人间烟火味都在这了。”
190 0
|
定位技术
如何利用外贸新方法,让你订单接到手软?
是否苦恼过如何在外贸领域做得更好? 是否曾经跟进了很久的客户,却无法让他们下订单? 是否经常遇到发送出去的邮件毫无回应的情况? 是否觉得明明很努力,但业绩总是不理想?
115 0
如何利用外贸新方法,让你订单接到手软?
|
移动开发 监控 安全
第十一期 | 你抢不到的优惠券,背后“元凶”竟是垃圾注册?
顶象防御云业务安全情报中心发现,某电商平台注册场景出现大批量异常注册。黑产通过批量注册获得大量平台账号,为其后续在电商平台大促期间开展批量抢券、秒杀、刷单等行为进行账号储备。
200 0
第十一期 | 你抢不到的优惠券,背后“元凶”竟是垃圾注册?
|
iOS开发 MacOS Python
抽奖过程公布,我用了一款有故事的抽奖工具
之前学委发表了一篇文末抽奖的文章:Python中处理字符串的常用函数汇总【文末送书】
202 0
抽奖过程公布,我用了一款有故事的抽奖工具
|
开发者
【活动操作指引】最高价值6000元新年礼包来啦!2021零门槛抢开发者加油包
【活动操作指引】最高价值6000元新年礼包来啦!2021零门槛抢开发者加油包
【活动操作指引】最高价值6000元新年礼包来啦!2021零门槛抢开发者加油包
|
SQL 数据库
【自然框架】注册会员活动——第一份代码的修改建议(第一版)
  前情回顾:       自然框架开源社区的第一次活动——实现会员注册 (活动介绍)     自然框架开源社区第一次活动的资源包  (内含数据库设计、数据库文档、实例代码)     参与方式   (可以在这里报名参加)     人员表设计思想 —— 也许会有点帮助 (数据库的设计思路)     【自然框架】开源社区活动,会员注册的第一份代码!  (第一份代码的 原版代码)       下载“好坏”的会员注册完整代码。
978 0