第3章 随机点名器案例(集合容器)

第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);
	}
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40807247/article/details/83117392