Java使用ArrayList实现“群主发红包”功能

Posted 勤快的懒羊羊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java使用ArrayList实现“群主发红包”功能相关的知识,希望对你有一定的参考价值。

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

  1. 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取;
  2. 成员领取红包后,保存到成员余额中。

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

 

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

 1 package day05_after03;
 2 
 3 /**
 4  * 定义成员类
 5  *
 6  * @author liuwenlong
 7  * @create 2020-07-14 18:08:25
 8  */
 9 @SuppressWarnings("all")
10 public class Human {
11     private String name;
12     private int age;
13     private int wallet;
14 
15     public Human() {
16     }
17 
18     public int getWallet() {
19         return wallet;
20     }
21 
22     public void setWallet(int wallet) {
23         this.wallet = wallet;
24     }
25 
26     public Human(String name, int age) {
27         this.name = name;
28         this.age = age;
29     }
30 
31     public String getName() {
32         return name;
33     }
34 
35     public void setName(String name) {
36         this.name = name;
37     }
38 
39     public int getAge() {
40         return age;
41     }
42 
43     public void setAge(int age) {
44         this.age = age;
45     }
46 
47     public String showInfo() {
48         return getName() + ", 余额:" + getWallet();
49     }
50 }

 

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

 1  /**
 2      * 群主发红包
 3      *
 4      * @param amount int 红包大小
 5      * @param count  int 红包个数
 6      * @return 返回拆分好的红包数组
 7      */
 8     public ArrayList<Integer> hangOut(int amount, int count) {
 9         ArrayList<Integer> RedPackage = new ArrayList<>();//创建一个数列,存放N份红包
10         if (!(this.getWallet() < amount)) {
11             int whole = amount / count;//整的钱
12             int surplus = amount % count;//余下的钱
13             for (int i = 0; i < count - 1; i++) {
14                 RedPackage.add(whole);
15             }
16             RedPackage.add((whole + surplus));//余下的加到最后一个上面
17             int getMoney = getWallet();
18             setWallet(getMoney - amount);//修改群主的钱包
19         } else {
20             System.out.println("余额不足!");
21             return null;
22         }
23         return RedPackage;
24     }

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

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

 1  /**
 2      * 群成员拆红包
 3      *
 4      * @param redPack 群主打包好的红包数组,随机抽取一个
 5      */
 6     public void receive(ArrayList<Integer> redPack) {
 7         int index = (int) (Math.random() * redPack.size());//从0到当前值取随机数,当前值递减
 8         int numberRedPack = redPack.get(index);//根据下标获取金额
 9         int selfAcount = getWallet();//获取自己之前的金额
10         setWallet((selfAcount + numberRedPack));//重新设置钱包
11         redPack.remove(index);//将红包数组内的这个红包删除,个数减少
12     }

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

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

 1 /**
 2  * 群主发红包
 3  *
 4  * @author liuwenlong
 5  * @create 2020-07-14 18:35:04
 6  */
 7 @SuppressWarnings("all")
 8 public class TestRedPack {
 9     public static void main(String[] args) {
10         ArrayList<Integer> red = new ArrayList<>();
11         Manage manage = new Manage("管理员", 20, 100);
12         Member m1 = new Member("张三", 18, 0);
13         Member m2 = new Member("李四", 17, 0);
14         Member m3 = new Member("王五", 16, 0);
15 
16         System.out.println(manage.showInfo());
17         System.out.println(m1.showInfo());
18         System.out.println(m2.showInfo());
19         System.out.println(m3.showInfo());
20 
21         System.out.println("=====================================================");
22         red = manage.hangOut(20, 3);//群主发红包
23         m1.receive(red);
24         m2.receive(red);
25         m3.receive(red);
26 
27         System.out.println(manage.showInfo());
28         System.out.println(m1.showInfo());
29         System.out.println(m2.showInfo());
30         System.out.println(m3.showInfo());
31 
32     }
33 }

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

 

以上是关于Java使用ArrayList实现“群主发红包”功能的主要内容,如果未能解决你的问题,请参考以下文章

为了讲明白继承和superthis关键字,群主发了20块钱群红包

Java中LinkedList类为何无法用List接口引用来实例化

Spring功能介绍SpringMVC集成Java Bean Validation实现参数检验功

Java的ArrayList实现

为啥 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的

Java——ArrayList基本使用