整点发放优惠券怎么做?必须用到这个谷歌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月前
|
存储 运维 算法
社交软件红包技术解密(十三):微信团队首次揭秘微信红包算法,为何你抢到的是0.01元
本文中,我们将介绍几种主流的IM红包分配算法,相信聪明的你一定能从中窥见微信红包技术实现的一些奥秘。
99 0
|
7月前
|
数据采集 JavaScript 前端开发
Haskell 实现京东优惠券爬取的详细步骤解析
Haskell 实现京东优惠券爬取的详细步骤解析
|
7月前
|
JavaScript 前端开发 测试技术
"0元搞定!手把手教你建网站,简单得就像泡桶方便面一样,上线个人网站轻而易举!"
没有服务器和公网IP,想要其他人访问自己做好的网站,该怎么办?今天教大家使用这款简单免费的内网穿透小工具——ngrok,有了它轻松让别人访问你的项目~
|
7月前
|
JavaScript 前端开发 Java
网上积分兑换商城的设计与实现(论文+源码)_kaic
网上积分兑换商城的设计与实现(论文+源码)_kaic
网上平台提现被拒客服以各种理由不给出应该怎么办?
网上被黑可能是你遇到黑平台才会导致的,遇到事情不要慌一下文章可能帮你换回损失
164 1
网上平台提现被拒客服以各种理由不给出应该怎么办?
|
Java 应用服务中间件 数据库
电商促销后台设计,写得太好了!
电商促销后台设计,写得太好了!
309 0
电商促销后台设计,写得太好了!
|
定位技术
如何利用外贸新方法,让你订单接到手软?
是否苦恼过如何在外贸领域做得更好? 是否曾经跟进了很久的客户,却无法让他们下订单? 是否经常遇到发送出去的邮件毫无回应的情况? 是否觉得明明很努力,但业绩总是不理想?
117 0
如何利用外贸新方法,让你订单接到手软?
|
iOS开发 MacOS Python
抽奖过程公布,我用了一款有故事的抽奖工具
之前学委发表了一篇文末抽奖的文章:Python中处理字符串的常用函数汇总【文末送书】
207 0
抽奖过程公布,我用了一款有故事的抽奖工具
|
程序员 云栖大会 开发者
【云栖大会夺宝攻略】在线PK、打卡领奖、抢offer,开发者专属玩法在这里
云栖大会2020就要来了! 什么才是开发者专属“游园”姿势? 丰厚“宝藏”如何免费拿? 不要慌!游玩入口就在下面,快点击图片去“夺宝”吧!
11814 0
【云栖大会夺宝攻略】在线PK、打卡领奖、抢offer,开发者专属玩法在这里
下一篇
DataWorks