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

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

相关文章
|
程序员 云栖大会 开发者
【云栖大会夺宝攻略】在线PK、打卡领奖、抢offer,开发者专属玩法在这里
云栖大会2020就要来了! 什么才是开发者专属“游园”姿势? 丰厚“宝藏”如何免费拿? 不要慌!游玩入口就在下面,快点击图片去“夺宝”吧!
11833 0
【云栖大会夺宝攻略】在线PK、打卡领奖、抢offer,开发者专属玩法在这里
|
新零售
当微信收费遇上Apple Pay,敬业福笑了
本文讲的是当微信收费遇上Apple Pay,敬业福笑了,本来这件事已经过去很久了,但是回来上班的第一天,小编还是禁不住对那张粉碎了万千少男少女梦的敬业福吐槽!因为它不仅赚走了流量,博取了眼球,上位成网红,还美其名曰拓展了我们的朋友圈。
1825 0
|
数据库
【自然框架】开源社区活动,会员注册的第一份代码!
  前情回顾:     自然框架开源社区的第一次活动——实现会员注册     人员表设计思想 —— 也许会有点帮助     自然框架开发系列(一):自然框架 和 AgileEAS.NET 合作,开发b/s的药店系统!     漫长的期待,终于等来了第一份代码,这份代码由“好坏”提供。
1000 0
|
8月前
|
存储 运维 算法
社交软件红包技术解密(十三):微信团队首次揭秘微信红包算法,为何你抢到的是0.01元
本文中,我们将介绍几种主流的IM红包分配算法,相信聪明的你一定能从中窥见微信红包技术实现的一些奥秘。
145 0
|
PHP
微信公众号现金红包展示形式说明
现金红包发放后会以公众号消息的形式触达用户,不同情况下触达消息的形式会有差别,规则如下:         官方地址 https://pay.weixin.qq.com/index.php/public/cms/content_detail?lang=zh&id=6000
1176 0
|
Web App开发 程序员 双11
阿里云双11活动撸福利 免费领取4688天猫红包
活动奖励:奖品为金额不等的云产品(通用)红包、云产品(专用)红包、天猫红包
2253 0

热门文章

最新文章