第3章 随机点名器案例
3.1 案例介绍
随机点名器,即在全班同学中随机的找出一名同学,打印这名同学的个人信息。
此案例在我们昨天课程学习中,已经介绍,现在我们要做的是对原有的案例进行升级,使用新的技术来实现。
我们来完成随机点名器,它具备以下3个内容:
存储所有同学姓名
总览全班同学姓名
随机点名其中一人,打印到控制台
3.2 案例需求分析
全班同学中随机的找出一名同学,打印这名同学的个人信息。
我们对本案例进行分析,得出如下分析结果:
1.存储全班同学信息(姓名、年龄)
2.打印全班同学每一个人的信息(姓名、年龄)
3.在班级总人数范围内,随机产生一个随机数,查找该随机数所对应的同学信息(姓名、年龄)
随机点名器明确地分为了三个功能。如果将多个独立功能的代码写到一起,则代码相对冗长,我们可以针对不同的功能可以将其封装到一个方法中,将完整独立的功能分离出来。
而在存储同学姓名时,如果对每一个同学都定义一个变量进行姓名存储,则会出现过多孤立的变量,很难一次性将全部数据持有。此时,我们采用ArrayList集合来解决多个学生信息的存储问题。
/*
学生,包含属性(姓名,年龄,性别)
定义类,类型StudentName1
三个属性:姓名,年龄,性别(char)
*/
public class StudentName1{
String name;
int age;
char sex;
}
/*
随机点名器,集合改进(学生的姓名和年龄)
现实中有学生这个事物,使用定义类的形式,描述学生事物
属性:姓名,年龄
姓名存储了数组,将容器换成是集合
String[] s = {"",""};
集合中,存储的是学生的姓名嘛?应该存储Student类型
存储学生:
学生类型,存储到集合中
总览:遍历集合
随机:随机数,作为索引,到集合中找到元素
三个功能,共享的数据,集合容器
定义三个方法,必须参数传递集合
类,它是引用数据类型,与之前学习的所有引用数据类型相同,
自定义类也是一种数据类型。
只是自定义类型并非Java为我们预先提供好的类型,而是我们自己定义的一种引用数据类型用来描述一个事物。
创建集合的常用格式在此说明一下:
C1:导包:import java.util.ArrayList;
C2:创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型:
C3:ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();
“<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型;
类的名字:首字母大写,第二个单词首字母大写 例如:BeiJngShiHaiDiangQuYiYuan
public class HelloWorld{
方法的名字:首字母小写,每个单词首字母大写 例如:addSchool
public static void main(String[] args){ //2.定义主方法
随机数类Random:
R1:导包:import java.util.Random;
R2:创建实例格式:Random 变量名 = new Random();
R3:调用方法:
public int nextInt(int maxValue) 产生[0,maxValue)范围的随机整数,包含0,不包含maxValue;
public double nextDouble() 产生[0,1)范围的随机小数,包含0.0,不包含1.0。
*/
// R1:导包:import java.util.Random;
import java.util.Random;
//C1:导包:import java.util.ArrayList;
import java.util.ArrayList;
//S1.导包:import java.util.Scanner
import java.util.Scanner;
public class CallName_1{
public static void main(String[] args){
//1.定义集合,存储的是StudentName1类型变量-方便后面方法参数传递同一个集合容器
ArrayList<StudentName1> array = new ArrayList<StudentName1>();
//System.out.println("--------------------学生随机点名系统----------------------");
//System.out.println("1.添加学生姓名");
//2.调用添加方法
addStudentNames(array);
//进入死循环(原因:只允许按到数字3退出系统,才结束整个系统,否则一直循环,由于不知道循环次数,一般采用while循环)
while(true){
//3.调用选择功能的方法,获取到用输入的功能序号
int chooseNumber = chooseFunction();
//4.对序号判断:1-进入查看库存功能 2-进入修改库存功能 3-结束
switch(chooseNumber){
case 1:
//4.1.调用遍历集合
printStudentNames(array);
break;
case 2:
//4.2.集合中随机抽取元素
randomStduentName(array);
break;
case 3:
//4.3.结束系统
//结束程序
System.out.println("============已退出系统===========================");
return;
default:
//4-4-没有其他功能
System.out.println("功能还在完善中,请重新输入...");
continue;//结束本次循环,继续死循环,让死循环只能当输入数字3,结束掉
}
}
}
/*
2.调用添加方法
定义方法,实现存储学生的姓名和年龄
返回值?没有
参数?创建StudentName类型变量,存储到集合中
*/
public static void addStudentNames(ArrayList<StudentName1> array){
//创建StudentName1类型变量
StudentName1 sn1 = new StudentName1();
StudentName1 sn2 = new StudentName1();
StudentName1 sn3 = new StudentName1();
sn1.name = "张思1";
sn1.age = 11;
sn1.sex = '男';
sn2.name = "张思2";
sn2.age = 12;
sn2.sex = '男';
sn3.name = "张思3";
sn3.age = 13;
sn3.sex = '男';
//将StudentName1变量,存储到集合中
array.add(sn1);
array.add(sn2);
array.add(sn3);
//System.out.println("============添加学生姓名结束==================");
}
/*
3.调用选择功能的方法,获取到用输入的功能序号
定义方法,键盘输入的数字-功能选择菜单 实现选择菜单,
返回值?键盘输入的数字(想要的功能对应数字)
参数?没有
*/
public static int chooseFunction(){
System.out.println("--------------------学生随机点名系统----------------------");
System.out.println("1.遍历学生姓名");
System.out.println("2.随机点名功能");
System.out.println("3.退出系统");
System.out.println("请输入要执行的操作序号:");
//接受键盘输入
//S2:创建对象实例:Scanner sc = new Scanner(System.in);
Scanner sc = new Scanner(System.in);
//S3.调用方法:int i = sc.nextInt();//用来接收控制台录入的数字
return sc.nextInt();
}
/*
4.1.调用遍历集合
定义方法:总览学生信息,遍历集合中元素(StduentName1类型变量),在用集合中方法get()去获取StduentName1类型变量中的相应的属性
返回值?没有
参数?存储StudentName1类型变量的集合容器
*/
public static void printStudentNames(ArrayList<StudentName1> array){
for(int i = 0; i < array.size(); i++){
//存储集合的时候,集合.add(sn1) sn1是StudentName1类型变量
//获取的时候,集合.get()获取出来的是什么,还是StudentName1类型变量
//若想获得StudentName1类型变量相应属性,需要采用StudentName1类型变量名.属性
StudentName1 s = array.get(i);
System.out.println("姓名 " + s.name + " 年龄 " + s.age + " 性别:" + s.sex);
}
System.out.println("============遍历学生姓名结束==================");
}
/*
4.2.集合中随机抽取元素
定义方法:随机数Random类,获取随机数,作为索引,到集合中找到元素(StudentName1类型变量)
在用集合中方法get()去获取StduentName1类型变量中的相应的属性
返回值?没有
参数?存储StudentName1类型变量的集合容器
*/
public static void randomStduentName(ArrayList<StudentName1> array){
System.out.println("开始随机点名喽,这次我们点到:");
//R2:创建实例格式:Random 变量名 = new Random();
Random ran = new Random();
// R3:调用方法:public int nextInt(int maxValue) 产生[0,maxValue)范围的随机整数,包含0,不包含maxValue;
int index = ran.nextInt(array.size());
//拿到随机数索引,用集合中方法get()到StudentName1类型变量
StudentName1 s = array.get(index);
//获取StduentName1类型变量中的相应的属性
System.out.println("姓名 " + s.name + " 年龄 " + s.age + " 性别 " + s.sex);
}
}