java arraylist包_Java基于ArrayList实现群主发红包功能

群主发普通红包,某群有多名成员,群主给成员发普通红包,普通红包的规则:

群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取;

成员领取红包后,保存到成员余额中。

请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作。

56b151a43515de68234c1c12f1c3a9d6.png

根据题目可以稍作分析,群主和普通群成员都隶属于用户类,那么久可以建立一个用户类,用户类的属性可以有用户名,金额或者钱包,如下:

package day05_after03;

/**

* 定义成员类

*

* @author liuwenlong

* @create 2020-07-14 18:08:25

*/

@SuppressWarnings("all")

public class Human {

private String name;

private int age;

private int wallet;

public Human() {

}

public int getWallet() {

return wallet;

}

public void setWallet(int wallet) {

this.wallet = wallet;

}

public Human(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String showInfo() {

return getName() + ", 余额:" + getWallet();

}

}

然后定义一个管理员类,管理员实现发红包的过程,可以通过以下方法

/**

* 群主发红包

*

* @param amount int 红包大小

* @param count int 红包个数

* @return 返回拆分好的红包数组

*/

public ArrayList hangOut(int amount, int count) {

ArrayList RedPackage = new ArrayList<>();//创建一个数列,存放N份红包

if (!(this.getWallet() < amount)) {

int whole = amount / count;//整的钱

int surplus = amount % count;//余下的钱

for (int i = 0; i < count - 1; i++) {

RedPackage.add(whole);

}

RedPackage.add((whole + surplus));//余下的加到最后一个上面

int getMoney = getWallet();

setWallet(getMoney - amount);//修改群主的钱包

} else {

System.out.println("余额不足!");

return null;

}

return RedPackage;

}

whole是要发的金额整除要发的份数,如果有余下的钱则存放到surplus中,使用循环将钱放到可变长数组里,并且将最后一个和余数相加,最后返回该可变长数组。

接下来就是群成员进行拆分红包,核心代码如下:

/**

* 群成员拆红包

*

* @param redPack 群主打包好的红包数组,随机抽取一个

*/

public void receive(ArrayList redPack) {

int index = (int) (Math.random() * redPack.size());//从0到当前值取随机数,当前值递减

int numberRedPack = redPack.get(index);//根据下标获取金额

int selfAcount = getWallet();//获取自己之前的金额

setWallet((selfAcount + numberRedPack));//重新设置钱包

redPack.remove(index);//将红包数组内的这个红包删除,个数减少

}

使用可变长数组ArrayList的好处就是可以不用考虑数组越界的问题。

最后定义一个测试类,实例化出管理员和三个群成员,

/**

* 群主发红包

*

* @author liuwenlong

* @create 2020-07-14 18:35:04

*/

@SuppressWarnings("all")

public class TestRedPack {

public static void main(String[] args) {

ArrayList red = new ArrayList<>();

Manage manage = new Manage("管理员", 20, 100);

Member m1 = new Member("张三", 18, 0);

Member m2 = new Member("李四", 17, 0);

Member m3 = new Member("王五", 16, 0);

System.out.println(manage.showInfo());

System.out.println(m1.showInfo());

System.out.println(m2.showInfo());

System.out.println(m3.showInfo());

System.out.println("=====================================================");

red = manage.hangOut(20, 3);//群主发红包

m1.receive(red);

m2.receive(red);

m3.receive(red);

System.out.println(manage.showInfo());

System.out.println(m1.showInfo());

System.out.println(m2.showInfo());

System.out.println(m3.showInfo());

}

}

最后将群主拆分好的红包返回到可变长数组red中,然后以此传给每个群成员。最终运行结果如下:

5bb3c46d77418a2927b82cdb818d23c8.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值