Android会员卡充值方案的实现
来源:互联网 发布:php防止xss 编辑:程序博客网 时间:2024/04/28 01:34
情景
产品来了新需求,做一个会员卡充值,可选充多少送多少,也可以输入其他任意金额并计算出送的金额。起初看这个需求还是比较简单的,实际在我做的时候,发现涉及到对算法的要求。
掉坑
服务端返回的充值方案的顺序是递增的(充值金额大的的排到最后),这好办了,输入的充值金额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);//递归 }}
阅读全文
0 0
- Android会员卡充值方案的实现
- 全新的会员卡模式-手机会员卡
- ecshop 会员卡的添加说明
- 研读会员卡系统的总结
- Android网络电台的一种实现方案
- android MQTT推送方案的实现
- android中gif图实现的方案
- [Android] 本地视频文件的缩略图实现方案
- 关于android沉浸状态栏的实现方案
- Android夜间模式的实现方案
- Android夜间模式的实现方案
- Android夜间模式的实现方案
- Android夜间模式的实现方案
- 电子会员卡绑卡提示未找到可以绑卡会员卡处理方案?
- 微信公众号实现会员卡领取
- PHP实现生成唯一会员卡号
- android表情实现方案
- android自动更新实现方案
- HDOJ 1009 FatMouse' Trade
- Hadoop DistributedCache使用及原理
- LeetCode——Hamming Distance
- 重拾并再次养成记录的好习惯
- CSS横向排序_让多个div盒子并排同行显示
- Android会员卡充值方案的实现
- ZOJ 3732 Graph Reconstruction (Havel-Hakimi定理)
- 【web html】html 大全
- RecyclerView 实现购物车功能
- JavaScript数据类型
- Qt程序设置界面显示在屏幕中央(包括多屏机的处理)
- caffe源码阅读
- 计算机网络第二次作业
- 一个高效的征选择算法-文本分类