题目:
分析以下需求,并用代码实现
有一个抽奖池,该抽奖池中存放了奖励的金额,
该抽奖池中的奖项为
{"魅族E","畅玩6X","坚果Pro","小米Note2","iphone 7Plus",
"一加手机 5","三星 Galaxy S6","华为p10 Plus","OPPO A77",
"华为荣耀 V9","努比亚 Z17","Moto Z Play"};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,
随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
2.每次抽的过程中,不打印,抽完时一次性打印(不要求交替抽奖,每个奖项只能被抽取一次),打印格式如下(以下是三次随机运行的效果):
第一次运行效果:
在此次抽奖过程中,抽奖箱2总共产生了6个奖项,分别为:[华为p10 Plus,iphone 7Plus,魅族E,小米Note2,OPPO A77,华为荣耀 V9]
在此次抽奖过程中,抽奖箱1总共产生了6个奖项,分别为:[三星 Galaxy S6,坚果Pro,一加手机 5,努比亚 Z17,Moto Z Play,畅玩6X]
第二次运行的效果:
在此次抽奖过程中,抽奖箱1总共产生了12个奖项,分别为:[OPPO A77,魅族E,努比亚 Z17,Moto Z Play,畅玩6X,坚果Pro,华为p10 Plus,一加手机 5,iphone 7Plus,小米Note2,三星 Galaxy S6,华为荣耀 V9]
在此次抽奖过程中,抽奖箱2没有抽到奖项,下次努力~
第三次运行的效果:
在此次抽奖过程中,抽奖箱1总共产生了7个奖项,分别为:[OPPO A77,小米Note2,iphone 7Plus,三星 Galaxy S6,华为荣耀 V9,华为p10 Plus,坚果Pro]
在此次抽奖过程中,抽奖箱2总共产生了5个奖项,分别为:[魅族E,一加手机 5,Moto Z Play,努比亚 Z17,畅玩6X]
注意:
1.每个奖项只能被抽取1次
2.抽完后一次性打印,而不是抽一次打印一次
3.如果一个奖项都没抽到,打印格式如下:
在此次抽奖过程中,抽奖箱x没有抽到奖项,下次努力~(x表示1或者2)
实现代码如下:
package com.abc.test;
import java.util.*;
public class ThreadTest {
public static void main(String[] args) {
Chou c = new Chou();
new Thread(() -> c.show(),"抽奖箱1").start();
new Thread(() -> c.show(),"抽奖箱2").start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
c.printResult();
}
}
class Chou{
String[] arr = new String[]{"魅族E","畅玩6X","坚果Pro","小米Note2","iphone 7Plus",
"一加手机 5","三星 Galaxy S6","华为p10 Plus","OPPO A77",
"华为荣耀 V9","努比亚 Z17","Moto Z Play"};
//获取数组长度为循环取数据的次数
int num = arr.length;
//创建一个用来标识数据是否被取出过的状态
boolean[] flag = new boolean[arr.length];
boolean temp = true;
Map<String,String> map = new HashMap<>();
public void show() {
//循环数组的长度
while(temp) {
synchronized (this) {
//判断取数据的次数,当num<=0时,说明数据全部取出了
if (num > 0) {
//取出随机的一个数据,获取索引0~num的值
int index = (int) (Math.random() * arr.length);
//判断索引为index的数据的状态,如果为false表示没有取出过,可以取出数据
if (!flag[index]) {
//可以取出数据,将状态改为true
flag[index] = true;
// 提示信息
// System.out.println(Thread.currentThread().getName() + "产生了" + arr[index] + "元大奖");
// 取一次数据,num--,减少一次取数据的次数
map.put(arr[index],Thread.currentThread().getName());
num--;
//休眠,看效果
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} else {
temp = false;
}
}
}}
public void printResult(){
Map<String,Object[]> map2 = new HashMap<>();
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String,String> entry : entries){
if(map2.containsKey(entry.getValue())){
Object[] strings = map2.get(entry.getValue());
List<Object> strings2 = Arrays.asList(strings);
List<Object> strings1 = new ArrayList<>();
strings1.addAll(strings2);
strings1.add(entry.getKey());
Object[] s = strings1.toArray();
map2.put(entry.getValue(), s);
}else{
map2.put(entry.getValue(),new Object[]{entry.getKey()});
}
}
Set<Map.Entry<String, Object[]>> entries1 = map2.entrySet();
for(Map.Entry<String,Object[]> entry : entries1){
System.out.println("在此次抽奖过程中," + entry.getKey() + "共产生了" + entry.getValue().length + "奖项,分别为:" + Arrays.toString(entry.getValue()));
if(map2.size() <= 1){
if("抽奖箱1".equals(entry.getKey())){
System.out.println("在此次抽奖过程中,抽奖箱2没有抽到奖项,下次努力~");
}else{
System.out.println("在此次抽奖过程中,抽奖箱1没有抽到奖项,下次努力~");
}
}
}
}
}
欢迎大家进行优化, 有些代码感觉写的比较惆怅~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)