您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2022-10-21 15:27:30  来源:  作者:华为云开发者联盟

本文分享自华为云社区《群主发红包带你深入了解继承和super、this关键字》,作者:共饮一杯无 。

需求

群主发随机红包或者普通红包。某群有多名成员,群主给成员发普通红包。
随机红包规则:

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

普通红包的规则:

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

案例分析

案例分析,可以得出如下继承关系:

 

案例代码实现

定义用户类

/**
 * 用户类
 * @author zjq
 */
public class User {
    /**
     * 姓名
     */
    private String name;
    /**
     * 余额,也就是当前用户拥有的钱数
     */
    private Integer money; 

    public User() {
    }

    public User(String name, Integer money) {
        this.name = name;
        this.money = money;
    }

    // 展示一下当前用户有多少钱
    public void show() {
        System.out.println("我是" + name + ",我有多少钱:" + this.fenToYuan(String.valueOf(money))+"元");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getMoney() {
        return money;
    }

    public void setMoney(Integer money) {
        this.money = money;
    }

    /**
     * 分转元
     * @param amount
     * @return
     */
    public   String fenToYuan(String amount){
        NumberFormat format = NumberFormat.getInstance();
        try{
            Number number = format.parse(amount);
            double temp = number.doubleValue() / 100.0;
            format.setGroupingUsed(false);
            format.setMaximumFractionDigits(2);
            amount = format.format(temp);
        } catch (ParseException e){
            e.printStackTrace();
        }
        return amount;
    }

}

定义群主类

package com.zjq.JAVAbase.base09.demo14;

import org.Apache.commons.lang3.RandomUtils;
import java.util.ArrayList;

/**
 * 群主的类
 * @author zjq
 */
public class Manager extends User {

    /**
     * 收到单个红包最大值
     */
    private static final int MAX_AMOUNT = 20000;

    public Manager() {
    }

    public Manager(String name, int money) {
        // 通过super 调用父类构造方法
        super(name, money);
    }
    /**
     * 发红包
     * @param totalMoney 红包总金额(单位分)
     * @param count 发包个数
     * @param type 发包类型(0、随机红包,1、定额红包)
     * @return 红包集合
     * @throws Exception
     */
    public ArrayList<Integer> send(Integer totalMoney, int count,int type) throws Exception {
        // 首先需要一个集合,用来存储若干个红包的金额
        ArrayList<Integer> redList = new ArrayList<>(count);

        // 首先看一下群主自己有多少钱
        Integer leftMoney = super.getMoney(); // 群主当前余额
        if (totalMoney > leftMoney) {
            System.out.println("余额不足");
            return redList; // 返回空集合
        }

        // 扣钱,其实就是重新设置余额
        super.setMoney(leftMoney - totalMoney);
        if (count == 1) {
            redList.add(totalMoney);
            return redList;
        }

        switch (type) {
            case 0:
                // 默认分配1分至每一位
                for (int i = 0; i < count; i++) {
                    redList.add(1);
                }
                int surplus_currency = totalMoney - redList.size(),// 剩余金额数
                        surplus_number = redList.size();// 剩余需追加的数量

                for (int i = 0; i < redList.size(); i++) {

                    // 没值可以追加了
                    if (new Integer(0).equals(surplus_currency)) {
                        break;
                    }

                    // (总数-(总包-i)*最小值) / (总包 - i) 随机安全值算法
                    int safe_total = (int)Math.floor((totalMoney - (count - i)) / (count - i));
                    if (new Integer(0).equals(safe_total)) {// 随机值不能为0
                        safe_total = 1;
                    }
                    // 该次随机值
                    int randomint = surplus_currency >= safe_total - 1 ? safe_total : surplus_currency + 1;
                    // 下次可能最大能剩余值
                    int nextMax_currency = (MAX_AMOUNT - 1) * (surplus_number - 1);
                    // 最小的随机数     剩余金额-剩余最大随机的总数(不含这一次)
                    int minRandom = surplus_currency -  nextMax_currency;
                    if (minRandom < 0) {
                        minRandom = 0;
                    }

                    // 规避一些特殊情况,每个接近2000或1时会发生
                    boolean must = (surplus_currency - count * MAX_AMOUNT <= 2 && surplus_currency - count * MAX_AMOUNT >= 0)
                            /*|| surplus_currency < packet_number * 2*/;
                    // 控制安全随机值           随机安全值不能大于最大限制,并且不能小于最小限 制
                    if (safe_total < minRandom || safe_total > MAX_AMOUNT || must) {
                        safe_total = MAX_AMOUNT;
                        // 该次随机值
                        randomint = surplus_currency >= safe_total - 1 ? safe_total : surplus_currency + 1;
                        // 下次可能最大能剩余值
                        nextMax_currency = (randomint - 1) * (surplus_number - 1);
                        // 最小的随机数     剩余金额-剩余最大随机的总数(不含这一次)
                        minRandom = surplus_currency -  nextMax_currency;
                        if (minRandom < 0) {
                            minRandom = 0;
                        }
                    }

                    // 下一次最大的随机值
                    int nextMaxRandomInt = nextMax_currency - (surplus_currency - (randomint - 1));
                    Integer maxRandom = nextMaxRandomInt <= 0 ? nextMaxRandomInt + randomint: null;
                    // 能随机          剩余的金额  - 最大随机数 >  最大随机数  * 剩余数量
                    boolean canRandom = surplus_currency - (randomint - 1) > nextMax_currency ||
                            nextMaxRandomInt > (randomint - 1)
                            || !new Integer(0).equals(minRandom);

                    int addNumber; // 追加的金额
                    if (canRandom && !new Integer(randomint).equals(minRandom+1) && !(new Integer(randomint).equals(minRandom) && new Integer(safe_total).equals(minRandom)) ) {
                        addNumber = myRandom(minRandom, maxRandom == null ? randomint : maxRandom- 1);
                    }else {
                        addNumber = randomint - 1;
                    }
                    redList.set(i,redList.get(i) + addNumber);
                    surplus_currency -= addNumber;
                    surplus_number--;
                }
                break;
            case 1:
                // 定额红包校验
                redList = new ArrayList<>(count);
                for (int i = 0; i <count; i++) {
                    //定额红包要是不能整除会有问题,正常实现应该是输入单个红包金额和总数直接就能计算
                    redList.add(totalMoney/count);
                }
                break;
            default:
                throw new Exception("类型错误!");
        }

        System.out.println("我是" + this.getName() + "我发了"+fenToYuan(String.valueOf(totalMoney))+"元红包"+",我现在有多少钱:" + fenToYuan(String.valueOf(this.getMoney()))+"元");
        return redList;
    }

    /**
     * 生成随机金额
     * @param min
     * @param randomint
     * @return
     */
    public static int myRandom(int min,int randomint) {
        if (min == 0) {
            return  RandomUtils.nextInt(0,randomint);
        }else {
            int nextInt = RandomUtils.nextInt(min,randomint - min);
            return nextInt + min;
        }
    }
}

定义成员类

/**
 * 普通成员
 * @author zjq
 */
public class Member extends User {

    public Member() {
    }

    public Member(String name, Integer money) {
        super(name, money);
    }

    public void receive(ArrayList<Integer> list) {
        // 从多个红包当中随便抽取一个,给我自己。
        // 随机获取一个集合当中的索引编号
        int index = new Random().nextInt(list.size());
        // 根据索引,从集合当中删除,并且得到被删除的红包,给我自己
        Integer delta = list.remove(index);
        // 当前成员自己本来有多少钱:
        Integer money = super.getMoney();
        // 加法,并且重新设置回去
        super.setMoney(money + delta);
        System.out.println("我是" + this.getName() + ",我抢到了"+fenToYuan(String.valueOf(delta))+"元红包"+",我现在有多少钱:" + fenToYuan(String.valueOf(this.getMoney()))+"元");
    }
}

定义测试类

public class MAInRedPacket {

    public static void main(String[] args) throws Exception {
        Manager manager = new Manager("群主", 10000);
        Member member1 = new Member("张三", 1000);
        Member member2 = new Member("李四", 1000);
        Member member3 = new Member("王五", 1000);
        Member member4 = new Member("赵六", 1000);
        Member member5 = new Member("孙七", 1000);
        Member member6 = new Member("小詹", 1000);
        Member member7 = new Member("小明", 1000);
        Member member8 = new Member("小红", 1000);

        manager.show(); // 100
        member1.show(); // 10
        member2.show(); // 10
        member3.show(); // 10
        member4.show(); // 10
        member5.show(); // 10
        member6.show(); // 10
        member7.show(); // 10
        member8.show(); // 10
        System.out.println("============================");

        // 群主总共发20块钱,分成8个红包
        ArrayList<Integer> redList = manager.send(2000, 8,0);
        // 八个普通成员收红包
        member1.receive(redList);
        member2.receive(redList);
        member3.receive(redList);
        member4.receive(redList);
        member5.receive(redList);
        member6.receive(redList);
        member7.receive(redList);
        member8.receive(redList);
    }

}

结果输出如下:

 



Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
早高峰打“飞的”有多快?半小时车程仅需6分钟
横越珠江,掠过广东省博物馆、花城广场等地标性景观,向着广州塔飞去&hellip;&hellip;近日,小鹏汇天的eVTOL(电动垂直起降飞行器)旅航者X2首次飞跃广州CBD。跨江示范飞行中,半小时车...【详细内容】
2024-04-12  Search:   点击:(1)  评论:(0)  加入收藏
JavaScript的异步编程常见模式
在JavaScript中,异步编程是一种处理长时间运行操作(如网络请求或I/O操作)的常见方式。它允许程序在等待这些操作完成时继续执行其他任务,从而提高应用程序的响应性和性能。JavaS...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
Rust编程语言的内存安全与性能:如何平衡?
Rust编程语言自诞生以来,就以其独特的内存安全特性和高性能而备受瞩目。然而,如何在保证内存安全的同时,实现高效的性能,一直是Rust开发者们面临的挑战。本文将深入探讨Rust的内...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
数字人破解跨境直播难题,打造经济高效运营新路径
在数字化浪潮席卷全球,跨境直播蔚然成风之际,众多企业与品牌纷纷借此渠道掘金国际市场,直面全球消费者。然而,构建一支专业且高能的直播团队并非一日之功,它需耗费大量资源进行人...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
Meta确认5月发布Llama 3,参数量达1400亿
周二,在伦敦的一场活动上,Meta 确认计划在下个月初推出其 LLM 的最新版 Llama 3,这个模型是驱动生成式 AI 助手的核心技术。这一消息证实了《The Information》杂志周一发布的...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
ChatGPT 应用商店?可能是一个万能应用程序!
OpenAI 在去年 11 月召开了一次开发者大会,首席执行官 Sam Altman 希望软件制造商在 ChatGPT 之上进行进一步的构建。OpenAI 表示,它将很快推出一个市场,开发人员和非技术人员...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
社交网络与Web3:数字社交的演进
在数字化时代的浪潮下,社交网络已成为人们日常生活的重要组成部分。从早期的在线论坛到如今的社交媒体平台,社交网络已经成为人们交流、分享和获取信息的主要渠道。然而,随着区...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
速查微信聊天最频繁对象,情侣必备!
在如今数字化交流的时代,微信无疑是我们日常生活中使用最频繁的工具之一。无论是工作、学习还是娱乐,微信都陪伴在我们身边,成为我们沟通的重要桥梁。而在微信的众多功能中,聊天...【详细内容】
2024-04-12  Search:   点击:(1)  评论:(0)  加入收藏
女人在微信上给你发这两个字,其实是想你了
情感的表达需借助书信,那一份份缓慢穿越时空的纸张,承载着承诺与深情,往往能够维系一段白头偕老的姻缘。而如今,随着科技的进步,爱情已不再依赖书信这种传统的沟通方式。我们有了...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  Search:   点击:(1)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条