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

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

相关文章
|
小程序
二二复制的七人拼团系统 | 拼团返红包商城模型系统小程序定制开发部署
留意拼团系统的小伙伴应该注意到,最近有款新拼团模式很受欢迎。它就是结合拼团和二二复制的七人拼团系统,设置了直推和间推奖励,有效促进用户主动积极裂变和团队平台引流提升销量的效果。平台还具有帮扶互助、自动轮回复投,循环不断等特点,增加用户粘度和提高商品复购率。
|
7月前
|
存储 JSON API
如何教会小白使用淘宝API接口获取商品数据
随着互联网的普及,越来越多的人开始接触网络购物,而淘宝作为中国最大的电商平台之一,成为了众多消费者首选的购物平台。然而,对于一些小白用户来说,如何通过淘宝API接口获取商品数据可能是一个难题。本文将详细介绍如何教会小白使用淘宝API接口获取商品数据。
|
6月前
|
存储 运维 算法
社交软件红包技术解密(十三):微信团队首次揭秘微信红包算法,为何你抢到的是0.01元
本文中,我们将介绍几种主流的IM红包分配算法,相信聪明的你一定能从中窥见微信红包技术实现的一些奥秘。
103 0
|
7月前
|
JavaScript 前端开发 Java
网上积分兑换商城的设计与实现(论文+源码)_kaic
网上积分兑换商城的设计与实现(论文+源码)_kaic
网上平台提现被拒客服以各种理由不给出应该怎么办?
网上被黑可能是你遇到黑平台才会导致的,遇到事情不要慌一下文章可能帮你换回损失
167 1
网上平台提现被拒客服以各种理由不给出应该怎么办?
|
iOS开发 MacOS Python
抽奖过程公布,我用了一款有故事的抽奖工具
之前学委发表了一篇文末抽奖的文章:Python中处理字符串的常用函数汇总【文末送书】
207 0
抽奖过程公布,我用了一款有故事的抽奖工具
|
程序员 云栖大会 开发者
【云栖大会夺宝攻略】在线PK、打卡领奖、抢offer,开发者专属玩法在这里
云栖大会2020就要来了! 什么才是开发者专属“游园”姿势? 丰厚“宝藏”如何免费拿? 不要慌!游玩入口就在下面,快点击图片去“夺宝”吧!
11819 0
【云栖大会夺宝攻略】在线PK、打卡领奖、抢offer,开发者专属玩法在这里
|
数据可视化 API Android开发
不管是三胎还是App!指望“拉新”太难了,还是要靠老用户!
正值六一儿童节前夕,三孩生育政策正式出台,应对中国生育率低的问题,专家瞄准了“复购和促活”。互联网搬砖人都懂,App运营的几大工作无非是:拉新、留存、促活、转化、传播、复购。而促活老用户,永远比拉新用户,容易得多。
不管是三胎还是App!指望“拉新”太难了,还是要靠老用户!
|
数据库
【自然框架】开源社区活动,会员注册的第一份代码!
  前情回顾:     自然框架开源社区的第一次活动——实现会员注册     人员表设计思想 —— 也许会有点帮助     自然框架开发系列(一):自然框架 和 AgileEAS.NET 合作,开发b/s的药店系统!     漫长的期待,终于等来了第一份代码,这份代码由“好坏”提供。
990 0
|
SQL 数据库
【自然框架】注册会员活动——第一份代码的修改建议(第一版)
  前情回顾:       自然框架开源社区的第一次活动——实现会员注册 (活动介绍)     自然框架开源社区第一次活动的资源包  (内含数据库设计、数据库文档、实例代码)     参与方式   (可以在这里报名参加)     人员表设计思想 —— 也许会有点帮助 (数据库的设计思路)     【自然框架】开源社区活动,会员注册的第一份代码!  (第一份代码的 原版代码)       下载“好坏”的会员注册完整代码。
981 0