Java发红包案例
Posted 秀发如云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java发红包案例相关的知识,希望对你有一定的参考价值。
【Java】发红包案例
目录:
来自:2020黑马JavaSE从基础到入门
1、题目要求
群主发普通红包。某群有多名成员,群主给成员发普通红包。
1、群主的一笔金额,从群主余额中扣除,“平均” 分成n等份,让成员领取。
2、成员领取红包后,保存到成员余额中。
请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作。
2、思路分析
2.1、 题目分析:
- 群主从拥有金额中拿出一部分金额,选择分成多少个红包发送,成员从这个已经分好的红包中随机拿取红包;
- 从上一句话可以知道群主与成员之间的联系是已经分好的红包,即发红包方法的返回值为**“已经分好的红包”**
- 并且成员是从已经分好的红包中随机拿取红包,所以需要用到动态数组 ArrayList
- 即再一步确定send方法返回值是ArrayList
2.2、再分析
2.2.1、群主类:
姓名(表示身份)、拥有金额、show方法展示自己拥有多少金额(来展示群主余额变化)、send方法(发红包)
public class Manager
private String name;
private int money;
public void show()
// ...
send方法分析:
三要素:
返回值类型:ArrayList // 返回存储已经分好的红包,让成员来接收红包
方法名称:send // 发红包
参数类型:int money , int count // 群主发多少金额,分多少个红包
public ArrayList<Integer> send()
// ...
2.2.2、普通成员类:
姓名(表示身份)、拥有金额、show方法展示自己拥有多少金额(来展示成员余额变化)、receive方法(收红包)
public class Member
private String name;
private int money;
public void show()
// ...
receive方法分析:
三要素:
返回值类型:void
方法名称:receive // 收红包
参数类型:ArrayList list // 需要群主已经分好的红包,来从动态数组中随机拿取
public void receive(ArrayList<Integer> list)
// ...
2.2.3 共性抽取:创建一个父类User
其有两个子类:群主类,成员类
并且其中定义了姓名、拥有金额以及show方法
public class User
private String name;
private int money;
public void show()
// ...
3、代码实现
User类:
package cn.itcast.day09;
public class User
private String name;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getMoney()
return money;
public void setMoney(int money)
this.money = money;
private int money;
public void show()
System.out.println("我是"+name+", 我有"+money+"。");
public User(String name, int money)
this.name = name;
this.money = money;
public User()
群主类Manager:
package cn.itcast.day09;
import java.util.ArrayList;
/*
分析:
群主发红包,选择发多少钱,发多少个包
将红包“均分”,并存放入集合(动态数组)中,等待用户来拿取。
发红包:
返回值类型:ArrayList<Integer> 返回一个已经分好了的红包集合(要支持随机拿,即动态数组)
方法名称:send 发送红包
参数列表:int money , int count 发多少钱,发几个包
*/
public class Manager extends User
public Manager(String name, int money)
super(name, money);
public Manager()
// 群主发红包
public ArrayList<Integer> send( int sendMoney , int count)
// 创建ArrayList 来存放count数量的红包。
ArrayList<Integer> list = new ArrayList<>();
// 平均瓜分,若剩余则分给最后一个
int avg = sendMoney / count;
int sy = sendMoney % count;
// 判断发送的钱是否足够,sendMoney ? money
if (sendMoney > super.getMoney())
System.out.println("余额不足!");
return list; // 返回一个空集合,结束
// 将分好的钱放到list中
for (int i = 0; i < count - 1; i++) // count - 1 ,如果不能均分,则将剩余的给最后一个
list.add(avg);
list.add(avg + sy);
// 钱已经分好,等待用户拿
return list;
成员类Member:
package cn.itcast.day09;
import java.util.ArrayList;
import java.util.Random;
/*
分析:
有多个用户,用户随机拿取已经分好的红包,从list中拿取
并且重新设置用户的剩余钱数。
收红包:
返回值类型:void
方法名称:receive // 接受红包
参数列表:ArrayList<Integer> list // 要从已经分好的list中拿取红包
*/
public class Member extends User
public Member()
public Member(String name, int money)
super(name, money);
// 收红包(假运气红包)
public void receive(ArrayList<Integer> list)
// 生成一个0~size-1 的随机数,作为list下标,来随机拿取红包
int index = new Random().nextInt(list.size());
// 随机从动态数组中拿取红包
int receiveMoney = list.get(index);
// 删掉拿走的红包,拿一个少一个
list.remove(index);
// 改变用户剩余的钱数
int delta = receiveMoney + super.getMoney();
super.setMoney(delta);
RedPacket:
package cn.itcast.day09;
import java.util.ArrayList;
/**
* Description:
* User:Al1veYoung
* Date:2021-03-16
* Time:8:14
*/
public class RedPacket
public static void main(String[] args)
Manager manager = new Manager("群主",100);
Member one = new Member("成员1",0);
Member two = new Member("成员2",0);
Member there = new Member("成员3",0);
Member four = new Member("成员4",0);
Member five = new Member("成员5",0);
Member six = new Member("成员6",0);
// 群主发钱
ArrayList list = manager.send(88,5);
manager.show();
System.out.println();
// 成员收钱
one.receive(list);
one.show();
two.receive(list);
two.show();
there.receive(list);
there.show();
four.receive(list);
four.show();
five.receive(list);
five.show();
4、结果展示
5、总结
小处理:
均分:如果无法均分,则将最后的零头给list最后一个。
随机获取:使用动态数组ArrayList, 用Random().nextInt(list.size())生成的随机数来作为index,来获取(get)动态数组中的“红包”。
跟新拥有金额:更新后的拥有金额 = 收到的钱(receive ) + 自己本来拥有的钱(super.getMoney);再用super.setMoney(跟新后的拥有金额) 来更新拥有金额。
以上是关于Java发红包案例的主要内容,如果未能解决你的问题,请参考以下文章