题目:
分析以下需求,并用代码实现
有一个抽奖池,该抽奖池中存放了奖励的金额,
该抽奖池中的奖项为
{"魅族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]) {//可以取出数据,将状态改为trueflag[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没有抽到奖项,下次努力~");}}}}}
欢迎大家进行优化, 有些代码感觉写的比较惆怅~