java随机的点名

简单的点名程序

刚刚入职有点无聊,就随性写了一个,目前测试无bug,有兴趣的同学可以拿去测试,测试数据比较少。
话不多说上代码

 public static void main(String[] args) {
       boolean over = false;
       // 下标,记录第几轮抽取
       int index = 1;
       // 已经抽到过的学生的下标,会保存在set集合
       Set set = new HashSet();
       // 所有学生名单数组 有去重操作
       List student = getStudent("a", "b", "c", "d", "e", "f");
       // 获取键盘输入的 每次抽几个学生
       int value = getScanValue("输入每次抽几个学生:");

       for (int i = 0; i < student.size(); i++) {
           // 如果size不等于0 同时取余数等于0 说明这一轮已经抽完
           if (set.size() != 0 && set.size() % value == 0) {
               System.out.print("第" + index + "轮学生抽完,按回车键继续,按1回车结束:");
               over = isOver(student, set);
               if (over) {
                   break;
               }
               // 抽完一轮 下标+1
               index++;
           }
           String randomStudent = randomStudent(student, set);

           System.out.println(randomStudent);
           // 已经抽过的学生 放在set集合中
           set.add(randomStudent);
       }
       if (!over) {
           System.out.print("第" + index + "轮学生抽完,");
           System.out.println("已经没有学生了!");
       }
   }

   private static String randomStudent(List student, Set set) {
       int size = student.size();
       List<String> list = student;

       // 如果学生数量大于40 同时已经有四分之三的学生被抽走 为了防止循环获取随机数次数太多 用剩余学生来抽取
       if (student.size() > 40 && student.size() / 4 * 3 <= set.size()) {
           list = new ArrayList<>(student);
           list.removeAll(set);
           size = list.size();
       }
       int random = (int) (Math.random() * size);
       // 如果随机数已经存在 那么循环获取 直到不重复
       while (set.contains(list.get(random))) {
           random = (int) (Math.random() * size);
       }
       return list.get(random);
   }

   private static int getScanValue(String msg) {
       int vlaue = 0;
       Scanner scan = new Scanner(System.in);
       System.out.print(msg);
       try {
           vlaue = Integer.parseInt(scan.next());
       } catch (Exception e) {
           // 递归调用 建议少用
           return getScanValue("参数不合法!\n请重新输入:");
       }
       return vlaue <= 0 ? getScanValue("参数需要大于0哦!\n请重新输入:") : vlaue;
   }

   private static List getStudent(String... name) {
       return Arrays.asList(name).stream().distinct().collect(Collectors.toList());
   }

   private static boolean isOver(List student, Set set) {
       boolean isOver = new Scanner(System.in).nextLine().equals("1");
       if (isOver) {
           student.removeAll(set);
           System.out.println("已结束,剩余学生数量:" + student.size() + "\n剩余名单" + student);
       }
       return isOver;
   }
  • 直接复制过去运行mian方法即可,注意abcd改成你需要的点名同学的名字
  • 有兴趣的同学可以一起探讨!
  • 在这里插入图片描述
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值