许久没有写blog

手有点生,但是准备开启常更模式了!

最近重拾Java知识,挑一些有趣的案例分享给大家。(拼手气红包案例)


分析:

首先,群主和成员都是微信、QQ等应用程序的用户,他们都可以归为用户类,那么由此我们可以很快地想到Java中一个很重要的特性:继承性。

一张图很直观地表达其关系:

其次,分析本程序的一些逻辑:

假设群主和成员本来都有一些钱(可以为0)

群主发的一笔金额(红包),从群主余额中扣除,平均分成n等份,让成员领取;成员领取红包后,保存到成员各自的余额中。


实现:

首先,定义用户类User

public class User {// 成员变量private String username; // 用户名private double leftMoney; // 余额,有角和分// 构造方法public User() {}public User(String username, double leftMoney) {this.username = username;this.leftMoney = leftMoney;}// get/set方法public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public double getLeftMoney() {return leftMoney;}public void setLeftMoney(double leftMoney) {this.leftMoney = leftMoney;}// 展示信息的方法public void show() {System.out.println("用户名:"+ username +" , 余额为:" + leftMoney + "元");}
}

(小技巧)快速创建Getter/Setter方法:

Alt + Insert

选择:

Getter and Setter

同理,user无参数方法和有参数方法快速创建可以选择:

Constructor

Select All和Select None即可实现全选和全不选。


其次,可以定义群主类Manager

public class Manager extends User {// 添加构造方法public Manager() {}public Manager(String username, double leftMoney) {// 通过super 调用父类构造方法super(username, leftMoney);}public ArrayList<Double> send(double money, int count) {// 获取群主余额double leftMoney = getLeftMoney();// 如果发出去的红包大于群主剩余钱,则发送失败if(money > leftMoney) {System.out.println("发送失败!");return null;}// 修改群主余额的super.setLeftMoney(leftMoney ‐ money);// 创建一个集合,保存等份金额ArrayList<Double> list = new ArrayList<>();// 扩大100倍,相当于折算成'分'为单位,避免小数运算损失精度的问题money *= 100;money = (int)money;// 每份的金额int avg = (int)(money / count);// 不能整除的余数int mod = (int)(money % count);// 无论是否整除,n‐1份,都是每份的等额金额for (int i = 0; i < count ‐ 1; i++) {// 缩小100倍,折算成 '元'list.add(avg / 100.0);}// 将最后一份不能整除的金额放到list的最后double last = (avg + mod)/100.0;list.add(last);// 返回集合return list;}
}

其中,要考虑到群主发的红包可能不是整数,且红包数为整数,那么有可能不能平均分配,所以我先平均分配,将多余的不能平均分配的金额放到最后一个红包内。


然后,我们定义成员类Member

public class Member extends User {public Member() {}public Member(String username, double leftMoney) {super(username, leftMoney);}// 打开红包,就是从集合中,随机取出一份,保存到自己的余额中public void receive(ArrayList<Double> list) {// 创建一个Random对象,随机生成一个红包编号int index = new Random().nextInt(list.size());// 从集合中移去相应编号,得到该编号的金额的红包double delta = list.remove(index);// 当前成员本来有多少钱double money = super.getLeftMoney();// 直接调用父类方法,设置到余额super.setLeftMoney( money + delta );}
}

最后,写执行程序,main函数执行:

public class mainRedPacket {public static void main(String[] args) {// 创建一个群主对象,三个成员Manager manager = new manager("群主" , 188.88);Member one = new Member("成员A",5.23);Member two = new Member("成员B",0);Member three = new Member("成员C",16.89);// 显示原始成员的余额manager.show();one.show();two.show();three.show();System.out.println("=================");// 创建一个键盘录入Scanner sc = new Scanner(System.in);System.out.println("请输入发送红包的金额:");double money = sc.nextDouble();// 发送红包ArrayList<Double> list = manager.send(money,3);// 打开红包one.receive(list);two.receive(list);three.receive(list);// 显示余额信息manager.show();one.show();two.show();three.show();}
}

结果展示:

分别进行三次红包发送:

第一次:群主余额188.88元,发送200元红包,发送失败,余额不足!

第二次:群主发送18元红包,三个人正好平分,每人6元。

第三次:群主发送0.31元红包,三人不能平分,所以其中一人多0.01元。

三次结果均正确


思考:

1.对于double类型的精度并没有控制,很又可能出现浮点数相加减或相乘除精度不正确的情况,读者可以自行思考,或者百度解决。

2.发红包不仅有普通红包,还有手气红包,那么可以用到随机数的知识来解决,博主将在后期慢更之,欢迎各位大犇给出自己的解法。

感谢您的阅读,不足之处欢迎指正!

Java实现微信、QQ等群主发红包实例(普通红包)相关推荐

  1. Java继承的综合案例——群主发红包

    群主发普通红包.某群有多名成员,群主给成员发普通红包.普通红包的规则: 群主的一笔金额,从群主余额中扣除,平均分成n等份.,让成员领取. 成员领取红包后,保存到成员余额中. 请根据描述,完成案例中所有 ...

  2. JAVA继承的综合案例——群主发普通红包

    群主发普通红包 一.问题描述 群主发普通红包.某群有多名成员群主给成员发普通红包.普通红包的规则: 1.群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取. 2.成员领取红包后,保存到成员余 ...

  3. java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格

    java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格 效果图,这里只放了几张,1-9张图片都可以的,如果图片路径是从数据库查出来的相对路径,记得加上绝对路径否则会报找不到读取文件 ...

  4. Java练习继承群主发红包案例(分析与实现)

    题目: 群主发普通红包,某群有多名成员,群主给成员发普通红包,普通红包的规则: 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取: 成员领取红包后,保存到成员余额中. 请根据描述,完成案例 ...

  5. 群主发红包——java学习

    package com.cn.test; //父类 用户 public class User {private String name;private int money;public User() ...

  6. java练习--群主发红包

    无论群主和群成员都有属性name,money,放在父类User里 package com.qml.study;public class User {private String name ;priva ...

  7. JAVA 群主发红包请红包案例 简易版

    综合案例:群主发红包 群主发普通红包.某群有多名成员,群主给成员发普通红包.       普通红包的规则:              1. 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取 ...

  8. 【继承】【群主发红包案例】

    一.题目要求: 群主发普通红包.某群有多名成员,群主给成员发普通红包.普通红包的规则: ①.群主的- -笔金额, 从群主余额中扣除,平均分成n等份,让成员领取. ②.成员领取红包后,保存到成员余额中. ...

  9. 群主发普通红包和手气红包

    群主发普通红包 群主发普通红包.群主有多名成员,群主给成员发普通红包.普通红包的规则: 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取. 成员领取红包后,保存到成员余额中. 请根据描述, ...

最新文章

  1. 第三代基因测序技术革新 云计算的应用
  2. Node中require方法的简单实现
  3. C++中的override关键字
  4. 《京东技术解密》——海量订单处理
  5. VB课本基础知识总结
  6. 做重?做轻?关键是要解决客户问题
  7. HDU 1244 Max Sum Plus Plus Plus
  8. aee快递查询 在php_第48课 thinkphp5添加商品库
  9. SpringMVC系列(十六)Spring MVC与Struts2的对比
  10. 字体的样式设置和字体分类
  11. OpenJWeb2.61 Java Web应用快速开发平台技术白皮书
  12. 日历java代码_java 日历代码实现
  13. 投影幕布尺寸计算器_投影距离和屏幕尺寸计算器Ver1.02.xls
  14. 加速基于flash的嵌入式应用程序
  15. 【深度学习】【ICLR2019】DARTS代码解读
  16. 一天一个小算法——最小生成树(kru Prm)
  17. redis lettuce 调优
  18. 【离散数学】最大元素、最小元素、极大元素、极小元素、上界、下界、最小上界(上确界)、最大下界(下确界)
  19. Windows10正式版为什么没有休眠选项?
  20. 通过“控制面板-程序和附件“查看程序安装位置(终极篇)

热门文章

  1. 周星驰开Instagram宣布招Web3.0 人才
  2. 技术、经济、商业、教育、职业、科学等知识图谱
  3. 织云 Metis:看腾讯怎么做智能运维
  4. antd pro 日期组件英文问题
  5. [Shader] Shader Cookbook 使用表面着色器[2]
  6. 双休日出差是否是加班?可以要求支付加班费么?
  7. nodejs发送邮件验证码封装(express框架)以QQ邮箱为例
  8. resteasy 客户端java_RestEasy Web服务客户端调用
  9. LIRE Documentation详解
  10. qt介绍03——Q_PROPERTY