1. 程式人生 > 實用技巧 >java 紅包案例 不是最好方案 新增成員需要new 還得調收紅包的方法 不調不會收

java 紅包案例 不是最好方案 新增成員需要new 還得調收紅包的方法 不調不會收

java 紅包案例 小白 不是最好方案 新增成員需要new 還得調收紅包的方法 不調不會收


//父類 群類
public class Group {
private String name;//名字
private String position;//職位
private double balance;//餘額
static int memberNum;//人數

//構造方法
public Group() {
}

public Group(String name, String position, double balance) {
this.name = name;
this.position = position;
this.balance = balance;
}

//getXxx() setXxx()
public String getName() {
return name;
}

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

public String getPosition() {
return position;
}

public void setPosition(String position) {
this.position = position;
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

}





//群主類 繼承群類

import java.util.ArrayList;
import java.util.Random;

public class GroupOwner extends Group {
static ArrayList<Double> arrPart = new ArrayList<>();//把發出來的隨機紅包金額 賦給arrPart陣列

//構造方法
public GroupOwner() {
}

public GroupOwner(String name, String position, double balance) {
this.setName(name);
this.setPosition(position);
this.setBalance(balance);
}

//發紅包方法 引數有錢和要發幾份
public void giveRedEnvelopes(double money, int numPeople) {
//發的錢從群主餘額扣除
setBalance(getBalance() - money);
//初始化
arrPart = new ArrayList<>();
double aceilingName = 0;//不能超出傳來的money總數
for (int i = 0; i < numPeople; i++) {//用份數當迴圈條件 可以人少份數多

Random random = new Random();

//隨機多少錢 隨機條件是 發的錢數/份數*2 公平點(隨機)
double nextInt = random.nextDouble() * (money / numPeople*2);

if (aceilingName >= money) {//發的份數的總錢數大於總錢數 退出
break;
} else if (i == numPeople - 1) {//最後一份 把剩下的全拿走
arrPart.add(money - aceilingName);

} else {//其他隨機
arrPart.add(nextInt);
}
aceilingName += nextInt;//疊加 發出去的份數 和錢數
}

System.out.println(getName() + "群主發了:" + money);

for (int i = 0; i < arrPart.size(); i++) {//遍歷 隨機紅包金額的錢 陣列 展示紅包
if (i == arrPart.size()) {//防止越界
System.out.println("第" + i + "個紅包為:" + arrPart.get(i));
break;
} else {
System.out.println("第" + (i + 1) + "個紅包為:" + arrPart.get(i));//索引對應紅包數,索引從0開始所以要+1
}

}
}
}





//成員類

import java.util.ArrayList;
import java.util.Random;

public class Member extends Group {
static ArrayList<Double> max = new ArrayList<>();//這個陣列用來儲存接收的紅包錢數判斷誰是手氣王
static ArrayList<String> name = new ArrayList<>();//這個陣列用來儲存名字的

//構造方法
public Member() {
}

public Member(String name, String position, double balance) {
Group.memberNum++;//調一次全參構造群人數就加一

this.setName(name);
this.setPosition(position);
this.setBalance(balance);
}

//收紅包方法
public void receiveLuckyMoney() {

double remove = 0;
//遍歷 群主發的紅包陣列
for (int i = 0; i < GroupOwner.arrPart.size(); i++) {
//隨即索引 取出 對應的紅包
int nextInt = new Random().nextInt(GroupOwner.arrPart.size());
//取出 刪除 返回值為:獲取的錢數
remove = GroupOwner.arrPart.remove(nextInt);

//調一次就把獲得的餘額 和姓名 傳給對應的陣列
max.add(remove);
name.add(getName());

//領取後把錢加到自己的餘額中
setBalance(getBalance() + remove);
System.out.println(getName() + "領取了:" + remove + "元" + "。現在餘額為:" + getBalance() + "元");
break;

}
}
}






//測試 群 類
import java.util.Scanner;

public class TestGroup {
public static void main(String[] args) {
//構造群主
GroupOwner groupOwner = new GroupOwner("張三", "群主", 5000);


//構造成員

Member member01 = new Member("李四", "成員", 500);
Member member02 = new Member("王五", "成員", 700);
Member member03 = new Member("趙六", "成員", 888);
Member member04 = new Member("田七", "成員", 999);

System.out.println("群里人數為:" + Group.memberNum);

//發多少錢紅包和個數
Scanner scanner = new Scanner(System.in);
System.out.println("輸入發多少錢:");
double money = scanner.nextDouble();
System.out.println("發幾份:");
int peopleNum = scanner.nextInt();
groupOwner.giveRedEnvelopes(money, peopleNum);

//收紅包
member01.receiveLuckyMoney();
member02.receiveLuckyMoney();
member03.receiveLuckyMoney();
member04.receiveLuckyMoney();

//手氣王
double temp = 0;//max 獲得的紅包錢數的中間變數
String maxName;//name 名字要隨著紅包變化而變化 就可以實現一一對應
//排序 降序 第一個索引就為最大值 名字和錢數一起變 所以就可以一一對應起來了
for (int i = 0; i < Member.max.size(); i++) {
for (int j = 0; j < Member.max.size() - 1; j++) {
if (Member.max.get(j) < Member.max.get(j + 1)) {
temp = Member.max.get(j);
Member.max.set(j, Member.max.get(j + 1));
Member.max.set(j + 1, temp);

//隨著餘額索引變化 而變化
maxName = Member.name.get(j);
Member.name.set(j, Member.name.get(j + 1));
Member.name.set(j + 1, maxName);
}
}
}
System.out.println("手氣王為:" + Member.name.get(0) + " 抽取了:" + Member.max.get(0) + "元");
}
}