高级发红包案例分析
场景:对于一个红包,所有人都需要有,而且最后一个红包是留给群主自己
对于分发到红包,为了更好的计算,应该用整数,而且单位为分
发红包的策略:
- 普通红包(平均分):每个人得到的红包数量是一致的,如果有零头,就包在最后的一个红包里面
- 手气红包(随机分):每个人得到的红包里面的钱是随机的,但是每个红包最少会有一分钱,最多也不会超过平均数的两倍,应该越发越少
用户
package RedPacket;
public class User {
private String name; //姓名
private int money; //余额,当前用户拥有的钱数
public User() {
}
public User(String name, int money) {
this.name = name;
this.money = money;
}
//展示成员有多少钱
public void show(){
System.out.println("我叫"+name+",我有"+money+"块钱");
}
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;
}
}
群主
package RedPacket;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
//群主类
public class Manager extends User {
private int totalMoney;
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getTotalMoney() {
return totalMoney;
}
public void setTotalMoney(int totalMoney) {
this.totalMoney = totalMoney;
}
public Manager(){
}
public Manager(String name, int money) {
super(name, money);
}
public void show(){
if (super.getMoney() < 100){
System.out.println("我叫"+super.getName()+",我破产了,我还有"+super.getMoney()+"块钱");
}else{
System.out.println("我叫"+super.getName()+",我还贼有钱,有"+super.getMoney()+"块钱");
}
}
public ArrayList<Integer> sendNormal(int totalMoney,int count){
totalMoney =this.totalMoney;
count = this.count;
//先创建一个集合,用来存放若干个红包的金额
ArrayList<Integer> redlist = new ArrayList<Integer>();
//群主当前余额leftMoney
int leftMoney = super.getMoney();
//判断群主想要发的钱,是否比自己剩下的钱还要多,如果群主想要发的钱比自己剩余的金额还要多,那么会显示余额不足,并返回一个空的集合
if (totalMoney >leftMoney){
System.out.println("余额不足");
return redlist;
}
//群主先扣钱,也就是重新设置自己的余额
super.setMoney(leftMoney-totalMoney);
//群主发红包需要设置每个红包的金额,也就是需要利用count去平均一下每个小红包的钱
//但是对于需要发的钱很可能会出现一个余数,即有三个人,发20块钱的红包,必定会有2块钱的零头,所以需要将零头放到最后一个领取的红包里
int avg = totalMoney / count;
int mod = totalMoney % count; //mod为零头
//塞红包,将钱一个个的塞到红包当中
if (mod == 0){
for (int i = 0; i < count; i++) {
redlist.add(avg);//如果没有零头,那么很好,每个人可得平均的钱,将平均的钱放到redlist中
}
}else{
for (int i = 0; i < count-1; i++) {
redlist.add(avg);//如果有零头,那么先把前几个放入平均的钱
}
int last = avg + mod;
redlist.add(last); //最后一个红包,加入零头,然后放入
}
return redlist;
}
public ArrayList<Integer> sendRandom(int totalMoney,int count){
totalMoney = this.totalMoney;
count = this.count;
ArrayList<Integer> redlist = new ArrayList<Integer>();
int leftMoney = super.getMoney();
//判断群主想要发的钱,是否比自己剩下的钱还要多,如果群主想要发的钱比自己剩余的金额还要多,那么会显示余额不足,并返回一个空的集合
if (totalMoney >leftMoney){
System.out.println("余额不足");
return redlist;
}
//群主先扣钱,也就是重新设置自己的余额
super.setMoney(leftMoney-totalMoney);
int endMoney = totalMoney;
int leftCount = count;
for (int i = 0; i < count-1; i++) {
Random r = new Random();
int money = r.nextInt((endMoney /leftCount)*2) + 1;
redlist.add(money);
endMoney = endMoney -money;
leftCount--;
}
redlist.add(endMoney);
return redlist;
}
public ArrayList<Integer> choise(){
System.out.println("请群主选择发红包的方式:");
System.out.println("1:普通红包\n2:手气红包");
System.out.println("请输入编号:");
Scanner sc_num = new Scanner(System.in);
int num = sc_num.nextInt(); //用来判断是普通红包还是手气红包
System.out.println("请输入红包金额:");
Scanner sc_many = new Scanner(System.in);
int many = sc_many.nextInt(); //用来确定红包的金额
System.out.println("请输入红包个数:");
Scanner sc_count = new Scanner(System.in);
int count = sc_count.nextInt(); //用来确定红包的个数
this.setTotalMoney(many); //调用Manager的设置红包金额函数来确定
this.setCount(count);
if (num == 1) {
ArrayList<Integer> list = this.sendNormal(this.getTotalMoney(),this.getCount());
return list;
}else{
ArrayList<Integer> list = this.sendRandom(this.getTotalMoney(),this.getCount());
return list;
}
}
}
员工
package RedPacket;
import java.util.ArrayList;
import java.util.Random;
//普通成员类
public class Number extends User{
public Number(){
}
public Number(String name, int money) {
super(name, money);
}
public void receive(ArrayList<Integer> list){
//从多个红包当中,随便抽取一个
//随机获取集合当中的一个索引
if (list.size() != 0){
int index = new Random().nextInt(list.size());
//根据索引值,从集合当中删除,并且的到被删除的红包
int delta = list.remove(index);
int money = super.getMoney();
super.setMoney(money + delta);
System.out.println("我是"+super.getName()+",我抢到了"+delta+"钱的红包,"+"我还有"+super.getMoney()+"块钱");
}else{
System.out.println("我叫"+super.getName()+"我没有抢到红包,贼惨!");
}
}
}
main函数
package RedPacket;
import java.util.ArrayList;
public class MainRedPacket {
public static void main(String[] args) {
Manager manager = new Manager("群主大大",2000);
manager.show();
ArrayList<Integer> list = manager.choise();
Number number1 = new Number("Tom",30);
Number number2 = new Number("Jerry",80);
Number number3 = new Number("Rain",10);
System.out.println("=============================================");
System.out.println("发红包后");
number1.receive(list);
number2.receive(list);
number3.receive(list);
manager.show();
}
}