【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(跟新后的拥有金额) 来更新拥有金额。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值