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发红包案例的主要内容,如果未能解决你的问题,请参考以下文章

案例分析发红包

发红包1.0

Java发红包案例

Java发红包案例

零基础学Java—发红包案例(二十三)

java基础---22. 发红包案例