Android会员卡充值方案的实现
情景
产品来了新需求,做一个会员卡充值,可选充多少送多少,也可以输入其他任意金额并计算出送的金额。起初看这个需求还是比较简单的,实际在我做的时候,发现涉及到对算法的要求。
掉坑
服务端返回的充值方案的顺序是递增的(充值金额大的的排到最后),这好办了,输入的充值金额BigDecimal recharge循环从最后一个开始比较,当大于等于集合中的某个充值方案MemberRechargePlan rechargePlan的充值金额时 BigDecimal rechargeAmount,拿到赠送金额并且累加。并且输入的recharge要减去rechargeAmount,break跳出循环后,再进行递归的操作。最终得到应该赠送的金额。
提交测试,测试反馈两个问题:
1.充值方案集合中有相同的充值金额,应该选择最大的赠送金额。
2.输入999999这种大数字的充值金额程序闪退。
解决问题一
对相同充值金额的只保留最大的赠送金额的,其他排除。然后再用冒泡排序法升序排列。代码:
//排重+排序
private void doExDupAndSortList() {
//step1:排重,取最大赠送金额
for (int i = 0; i < listRechargePlan.size() - 1; i++) {for (int j = listRechargePlan.size() - 1; j > i; j--) {if (listRechargePlan.get(j).getRechargeAmount().compareTo(listRechargePlan.get(i).getRechargeAmount()) == 0) {if (listRechargePlan.get(j).getGiftAmount().compareTo(listRechargePlan.get(i).getGiftAmount()) != 1) {listRechargePlan.remove(j);} else {listRechargePlan.remove(i);}}}}
//step2:排序
for (int i = 1; i < listRechargePlan.size(); i++) {for (int j = 0; j < listRechargePlan.size() - i; j++) {if (listRechargePlan.get(j).getRechargeAmount().compareTo(listRechargePlan.get(j + 1).getRechargeAmount()) == 1) {MemberRechargePlan temp = listRechargePlan.get(j);listRechargePlan.set(j, listRechargePlan.get(j + 1));listRechargePlan.set(j + 1, temp);}}}
}
解决问题二
由于输入的充值金额过大,导致了多层递归嵌套,抛出 java.lang.stackoverflowerr堆栈溢出异常。解决方法就是减少递归,代码:
//计算赠送金额
private void countGiftMoney(BigDecimal recharge) {boolean haveRecharge = false;int size = listRechargePlan.size() - 1;for (int i = size; i >= 0; i--) {MemberRechargePlan plan = listRechargePlan.get(i);if (plan.getRechargeAmount().compareTo(recharge) != 1) {BigDecimal[] divide = recharge.divideAndRemainder(plan.getRechargeAmount());BigDecimal beishu = divide[0];//倍数//加上 赠送金额*倍数giftMoney = giftMoney.add(plan.getGiftAmount().multiply(beishu));//减去 充值金额*倍数recharge = recharge.subtract(plan.getRechargeAmount().multiply(beishu));haveRecharge = true;break;}}if (haveRecharge && recharge.compareTo(BigDecimal.ZERO) == 1) {countGiftMoney(recharge);//递归}
}
Android会员卡充值方案的实现相关推荐
- 蛋糕店会员卡充值方案有哪些?
我们家是开蛋糕店的,最近推出了会员模式,但会员充值方案不知道怎么设置,所以请问一下蛋糕店会员卡充值方案有哪些呢? 其实操作的方法非常的简单,就是帮助蛋糕店设计了一个49元会员资格,涉及到一个49块钱的 ...
- APP(ios、Android)实现充值的方案
APP(ios.Android)实现充值的方案 Android 安卓手机对于付费审核没有规则,可以做微信或支付宝的三方接口调用.也可以直接做银行卡充值. ios ios对于应用的充值功能有明确的限制, ...
- 会员卡充值软件系统多少钱一套?桶装水会员充值方案微信小程序开源源码开发制作
龙兵科技,自主研发,源码交付,专注软件研发10年,各行业源码齐全,欢迎合作 今天有一个做桶装饮用水的客户来咨询我, 如何开展全员营销? 如何去做好顾客的转介绍和裂变? 如何去引爆客流量? 给他提供了一 ...
- 业务逻辑组件化android,AppJoint 极简 Android 组件化方案
AppJoint 极简 Android 组件化方案.仅包含 3 个注解加 1 个 API,超低学习成本,支持渐进式组件化. 开始接入 在项目根目录的 build.gradle 文件中添加 AppJoi ...
- android热更新插件,与Android热更新方案Amigo的再次接触
Amigo 作为一个"过气"的的热修复框架,用来学习和了解一下热修复的基本原理还是很好的.本文是本系列的第三篇. 前两篇: 与Android 热更新方案Amigo的初次接触 原作者 ...
- android屏幕适配教程,Android屏幕适配方案,android屏幕适配
Android屏幕适配方案,android屏幕适配 文章转载禁止用于商业用途,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处莫高雷草原以及作者@JiongBull. Android屏幕适配方 ...
- android fota解决方案,Android智能终端FOTA方案的制作方法
技术特征: 1.android智能终端fota方案发明专利权利要求 1.一种智能终端连续增量升级实现方法. 2.其特征在于所有任何终端设备可以一次性增量升级到最新版本,也可以对部分版本一次性增量升级到 ...
- 2021年最详细的Android屏幕适配方案汇总
1 Android屏幕适配的度量单位和相关概念 建议在阅读本文章之前,可以先阅读快乐李同学写的文章<Android屏幕适配的度量单位和相关概念>,这篇文章包含了阅读本文的一些基础知识,推荐 ...
- 干货满满,Android热修复方案介绍
摘要:在云栖社区技术直播中,阿里云客户端工程师李亚洲(毕言)从技术原理层面解析和比较了业界几大热修复方案,揭开了Qxxx方案.Instant Run以及阿里Sophix等热修复方案的神秘面纱,帮助大家 ...
最新文章
- 用c语言编程求主析取范式,求主析取范式.cpp · wangzhankun/C-Programming-Learn - Gitee.com...
- c程序隐藏linux,linux 下隐藏进程的一种方法
- bootstrap学习笔记(一)网络系统
- VMware 安装kali——linux
- java 迭代器失效_迭代器失效的几种情况
- SQL语句的解析过程
- Xstream-1 原理
- Android广播时间——实现强制下线功能
- Android Q共享音频输入
- 如何利用linux解除手机bl锁,小米手机解BL锁教程(小米手机详细图文详解解锁Bootloader教程)...
- R查看和更改工作路径的命令
- 半监督学习与直推式学习
- v4l2loopback 简介
- springboot--dubbo+nacos+LCN整合详解
- 在Octane中提升渲染速度的技巧(第2部分)
- Logstash:使用 mutate 过滤器
- createTrackbar滑条函数
- java clh_【Java并发编程实战】—– AQS(四):CLH同步队列
- 上海税务局网站 环境检测 可信任站点未设置问题
- Pytorch系列笔记(六)