使用Scanner、Random、Arrays、ArrayList完成不重复的点名

本文详细介绍了如何使用Java集合框架中的ArrayList和Random类实现一个随机点名的功能,包括从控制台获取用户输入,避免点名重复以及处理点名过程中可能遇到的异常情况。当所有名字被点完时,程序会提示已全部点名并退出。此外,还讨论了在点名过程中可能引发的IllegalArgumentException异常,并给出了相应的解决方案,确保程序的稳定运行。
摘要由CSDN通过智能技术生成

思路:首先使用Arrays的asList()方法来存储全部学生姓名,接着把他们全部存储到ArrayList集合中,然后使用Scanner获取从控制台输入的指令,最后使用Random生成随机下标访问ArrayList集合中的数据

 1.存储数据

List<String> list = Arrays.asList("zs","ls","ww","zl","tq");

2.构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的

List<String> names = new ArrayList<String>(list);

3.Scanner获取从控制台输入的指令

Scanner scanner = new Scanner(System.in);
String input = scanner.next();

4.使用do{}while()循环产生随机数,通过该随机数来获取到集合中的数据

do{
   if(input.equals("Y") || input.equals("y")){
   int index = random.nextInt(names.size());
   System.out.println(names.get(index));
   input = scanner.next();
  }else{
   System.out.println("已退出点名");
   break;
  }
}while (true);

测试一下

这样发现我们输出的名字会重复,那怎么解决呢?我们只需要在每次输出姓名之后通过ArrayListremove()方法来删除该姓名即可。

do{
   if(input.equals("Y") || input.equals("y")){
   int index = random.nextInt(names.size());
   System.out.println(names.get(index));
   names.remove(index);
   input = scanner.next();
  }else{
   System.out.println("已退出点名");
   break;
  }
}while (true);

 可是当我们再测试的时候我们会发现虽然姓名不会重复了,可是当我们一直点名时会发生异常

原因是当我们把集合中的数据全部remove之后,这时集合的元素数为0,而我们Random中的nextInt传入的参数需要是大于0的,则会报IllegalArgumentException(不合法的参数异常),所以我们循环之前需要判断一下集合中是否有元素,如果没有直接跳出循环

if(names.isEmpty()){
  System.out.println("已全部点名");
  break;
}

这样不重复点名的全部代码就完成了

全部代码:

import java.util.*;

public class Main {
 public static void main(String[] args) {
   Scanner scanner = new Scanner(System.in);
   Random random = new Random();
   List<String> list = Arrays.asList("zs","ls","ww","zl","tq");
   List<String> names = new ArrayList<String>(list);
   System.out.println("开始点名请输入Y/y");
   System.out.println("结束点名请输入任意键");
   String input = scanner.next();
   do{
    if(names.isEmpty()){
       System.out.println("已全部点名");
       break;
     }
     if(input.equals("Y") || input.equals("y")){
       int index = random.nextInt(names.size());
       System.out.println(names.get(index));
       names.remove(index);
       input = scanner.next();
     }else{
       System.out.println("已退出点名");
       break;
     }
    }while (true);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值