面向对象应用
以题为例
集合问题:用集合完成点名器(要求:点名时不能重复,其他细节自由创造)
完成效果如图:
__学生档案__
1.存储同学名字 *
2.查看全班同学姓名 *
3.点名 ****
4.退出 ****
-> 请输入您选择的编号:
1
请输入您要录入的同学数量:
2
请输入第1位同学的姓名:
帅哥1
请输入第2位同学的姓名:
帅哥2
2名同学已录入成功!
__学生档案__
1.存储同学名字 *
2.查看全班同学姓名 *
3.点名 ****
4.退出 ****
-> 请输入您选择的编号:
2
全班同学为:
帅哥1 帅哥2
__学生档案__
1.存储同学名字 *
2.查看全班同学姓名 *
3.点名 ****
4.退出 ****
-> 请输入您选择的编号:
3
点到的同学为:---> 帅哥1
__学生档案__
1.存储同学名字 *
2.查看全班同学姓名 *
3.点名 ****
4.退出 ****
-> 请输入您选择的编号:
3
点到的同学为:---> 帅哥2
__学生档案__
1.存储同学名字 *
2.查看全班同学姓名 *
3.点名 ****
4.退出 ****
-> 请输入您选择的编号:
4
您已退出
写这道题之前呢,我是有跟着老师的教学视频来的,老师在教学视频中有讲解一个学生管理系统的案例,大体上这些题目都差不多,还学会了退出系统的一个小技巧。
Attention:
1.在看到这个界面第一眼就是知道,我们需要创建3个方法,完成1,2,3选项。
2.我们需要输出主界面,并且构造循环,让我们除了选项4退出的时候,其他都可以返回主界面继续选择选项进行操作。
3.这之中我们需要用到Scanner来键入我们需要的属性和信息,以及Random随机数,来获得随机点民这个最主要的部分。
4.这一部分我们主要学习的内容也要用上,封装、类以及这一关的内容ArrayList集合。
好,那我们就在这么一个比较大比较广泛的基础上来开始捋清顺序开始写我们的程序。
首先我们就可以先在main方法里面使用循环输出整个主界面,方法还没有创建,所以我们先只是写个输出,后面写了方法就可以注释掉然后写成调用方法的形式。
1.创建一个Student类集合(Student类就是写了学生们的姓名学号和年龄属性封装构造一下方法,都是最平常的写法,所以在这里小白就不展示了哦)
2.Scanner导包
3.使用while循环输出表头,在4选项下面就写一个String的键入,让用户输入选项操作
4.每个选项怎样进入到单独的方法就是我们的switch循环方法了,键入哪个选项调用哪个方法(一定要记得break,小白学到这里前面的都忘了,经常忘记break😭)
整体一个代码的写法如下(都是最原始的简单代码):
public static void main(String[] args) {
ArrayList<Student> array = new ArrayList<Student>();
Scanner sc = new Scanner(System.in);
while (true) {
//输出表头
System.out.println("__黄埔学生档案__");
System.out.println("1.存储同学名字");
System.out.println("2.查看全班同学姓名");
System.out.println("3.点名");
System.out.println("4.退出");
System.out.println("-> 请输入您选择的编号:");
String num = sc.nextLine();
switch (num) {
case "1":
System.out.println("存储同学名字");
break;
case "2":
System.out.println("查看全班同学姓名");
break;
case "3":
System.out.println("点名");
break;
case "4":
System.out.println("退出");
break;
}
}
}
在这里呢,我们就是写存储同学们姓名的方法,这个方法要注意的地方就是顺序一定要对,因为顺序不对小白已经奔溃很久了,一直出错。还可以看到我中间是有调用另一个方法,这个方法的意义在于判断学号是否被使用过,如果使用过就不可以再用了。
1.创建Scanner对象,先要输入我们想录入几个同学,这是个int
2.先把我们的三个属性初始化一下,让后面的小伙伴们都认识它们🤓
3.开始我们的键入信息,这个添加是循环的,我们的信息键入是使用的for循环,相当于遍历,走一遍写一个学生的信息这样,取值范围就是要小于我们键入的录入学生数量
4.顺序下来,我们创建Student对象,开始接收这些键入的内容,然后把这个学生类对象添加到我们的集合中去。
5.要记得实现效果图中在我们输入完最后一个同学的信息后会出现的提示语句,小白是在for循环以及上面的各种接收完后写了个if判断语句,当遍历循环中的i和我们想要录入的同学数量相同是输出这一句话。
6.我们在while循环的最后写return,这样就可以才可以在我们写完以后继续跳到主界面选项
好,那么下面是我们添加同学方法的一个代码展示:
//创建存储同学姓名的方法
public static void addStudent(ArrayList<Student> array) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要录入的同学数量:");
int n = sc.nextInt();
//初始化,进行赋值
String name = null;
String age = null;
String sid = null;
while (true) {
for(int i = 1; i<=n; i++) {
System.out.println("请输入第" + i + "位同学的姓名:");
name = sc.next();
System.out.println("请输入第" + i + "位同学的年龄:");
age = sc.next();
System.out.println("请输入第" + i + "位同学的学号:");
sid = sc.next();
//调用,查看学号是否重复
boolean flag = isUsed(array,sid);
//if判断是否重复,如果重复则输出语句,不重复就继续执行
if(flag) {
System.out.println("你输入的学号已被使用,请重新输入:");
} else {
//创建学生对象接收信息
Student s = new Student();
s.setName(name);
s.setAge(age);
s.setSid(sid);
//把信息收集到集合里面
array.add(s);
}
//判读语句,当循环到最后一个的时候,写完信息就输出这句话
if(i == n) {
System.out.println(n + "名同学已录入成功!");
}
}
return;
}
}
这里就是我们检查学号是否重复的方法,那么这个方法在写的时候并不是很难,小白运行后一直出错是在它的调用方法顺序那里,下面我们来讲解一下。
1.这个方法首先要清楚,它是有返回值的,它要返回true或者false来告诉我们是否重复
2.在这里我们可以先定义一个boolean类型的数据(也可以选择不定义直接写语句)
3.这里我们使用到for循环,这个循环的意义在于我们需要查找集合中我们添加的学号是否有和我们的Student重复的,所以for循环的取值范围是集合的大小。
4.如果有,这里我们用if语句,因为我们是要比较两个String类型的值,所以这里我们使用equals,比较Student s获得的sid和我们键入的sid是否相同,如果相同就把true赋值给我们的boolean数据,然后结束break,在我们循环结束后我们需要返回我们定义的boolean数据,这样才是一个完整的方法。
5.调用的时候,小白当时是觉得随便调用就好,但是不,我们需要观察整个方法,然后按照顺序才可以调用,当我们输出完学生信息,并且在他们被接收前才是我们调用这个办法的时候,调用完我们还需要写一个if语句来告诉客户是否重复。
这一部分调用那里可以用真人举例,当我们现实生活中录入学生的时候怎样知道我们是否重复,先查还是先录,如果我们先录入,这个学生就直接存在了,所以我们需要先查,这也就是为什么调用方法我们用在键入后面,接收前面才可以成功实现
//创建方法,防止学生重复
public static boolean isUsed(ArrayList<Student> array, String sid) {
//如果与集合中的某一个学生学号相同,返回true;如果都不相同,返回false
boolean flag = false;
for(int i = 0; i<array.size(); i++) {
Student s =array.get(i);
if(s.getSid().equals(sid)) {
flag = true;
break;
}
}
return flag;
}
这里我们开始写我们查看全班同学信息的方法,小白当时写的时候是觉得单一个姓名比较单调,所以就写了年龄学号这些信息,所以才会有查看是否重复这个方法,题目本身并没有要求查看是否重复。
1.首先我们需要先判断集合里面是否有内容,因为没有内容我们查看也查看不到,但是我们需要写一个提示信息,所以这里我们先用if语句来查看集合的size是否等于0;等于就是没有内容所以这时候我们输入提示信息并且返回主界面,去添加学生。
2.在这里呢,小白比较在意最后运行出来出现的一个格式,会想弄漂亮一点,所以我们先输出表头
3.然后开始我们的遍历,遍历集合中每一项内容,然后用我们的Student接收,最后输出,根据表头依次顺序输出。
可能有的友友们不晓得 “\t” ,这个就相当于Tab键,就是给他们输出空格用的,也省得我们一个一个打空格,下面是我们查看同学姓名的一个方法代码展示:
//创建查看全班同学姓名的方法
public static void seeStudent(ArrayList<Student> array) {
//这里判断集合本身有无内容
if(array.size() == 0) {
System.out.println("无信息,请先添加学生");
return;
}
System.out.println("学号\t\t\t姓名\t\t年龄");
for(int i = 0; i<array.size(); i++) {
Student s = array.get(i);
System.out.println(s.getSid() + "\t\t\t" + s.getName() + "\t" + s.getAge());
}
}
这个方法小白是有思路,但是不知道具体实现形式,所以拿去问老师,最后实现出来确实很简单(但是面对老师还是像回到高中,被班主任支配的恐惧😱)
1.这个方法首先第一步肯定就是创建我们的Random随机数了。
2.这一部分呢想要简便的写法就是要熟知random的各种用法,我们可以看到r.nextInt(array.size())这是random输出的一个写法,括号中的内容就是random随机取值的范围,我们题目的范围就是在集合中随机点一个同学姓名,这里我们不需要循环,因为我们点完这个名字以后再需要点名就可以再选一次3选项重新运行一个出来,array.get(r.nextInt(array.size())).getName()这一句我们一个一个拆分来看,就是我们取值范围内随机取到一个值也就是r.nextInt(array.size()),我们就可以用这个值在集合中找到索引位置也就是array.get(r.nextInt(array.size())),我们最后输出的是学生的姓名,也就是取到了该位置上的具体内容,直接在后面“.”就会出现方法,集合得到内容就是array.get,我们想得到名字,也就是最后输出的这样一个表达式:array.get(r.nextInt(array.size())).getName()
这样一个表述应该会有点乱😂,但这是小白仅有的词汇了,所以大家可以多看几遍(顺便点个赞),捋清一下顺序
//创建方法,随机点名
public static void getStudent(ArrayList<Student> array) {
//生成随机数
Random r = new Random();
//输出产生随机数的上限
System.out.println(r.nextInt(array.size()));
//输出在限制范围内的学生姓名
System.out.println(array.get(r.nextInt(array.size())).getName());
}
OK~这就是这个题目整个我对于代码的理解与不理解之处,我最后来放一下全部的代码(注意:Student类我就不展示了):
package ArraylistTest0.第一题;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class callName {
public static void main(String[] args) {
ArrayList<Student> array = new ArrayList<Student>();
Scanner sc = new Scanner(System.in);
while (true) {
//输出表头
System.out.println("__黄埔学生档案__");
System.out.println("1.存储同学名字");
System.out.println("2.查看全班同学姓名");
System.out.println("3.点名");
System.out.println("4.退出");
System.out.println("-> 请输入您选择的编号:");
String num = sc.nextLine();
switch (num) {
case "1":
// System.out.println("存储同学名字");
addStudent(array);
break;
case "2":
// System.out.println("查看全班同学姓名");
seeStudent(array);
break;
case "3":
// System.out.println("点名");
getStudent(array);
break;
case "4":
System.out.println("退出");
// break;
System.exit(0);
}
}
}
//创建存储同学姓名的方法
public static void addStudent(ArrayList<Student> array) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要录入的同学数量:");
int n = sc.nextInt();
//初始化,进行赋值
String name = null;
String age = null;
String sid = null;
while (true) {
for(int i = 1; i<=n; i++) {
System.out.println("请输入第" + i + "位同学的姓名:");
name = sc.next();
System.out.println("请输入第" + i + "位同学的年龄:");
age = sc.next();
System.out.println("请输入第" + i + "位同学的学号:");
sid = sc.next();
//调用,查看学号是否重复
boolean flag = isUsed(array,sid);
//if判断是否重复,如果重复则输出语句,不重复就继续执行
if(flag) {
System.out.println("你输入的学号已被使用,请重新输入:");
} else {
//创建学生对象接收信息
Student s = new Student();
s.setName(name);
s.setAge(age);
s.setSid(sid);
//把信息收集到集合里面
array.add(s);
}
//判读语句,当循环到最后一个的时候,写完信息就输出这句话
if(i == n) {
System.out.println(n + "名同学已录入成功!");
}
// //这里有问题不会在循环跳出已被使用学号这句话,但是想添加3个学生的信息添加完一个就跳出了
}
return;
}
}
//创建方法,防止学生重复
public static boolean isUsed(ArrayList<Student> array, String sid) {
//如果与集合中的某一个学生学号相同,返回true;如果都不相同,返回false
boolean flag = false;
for(int i = 0; i<array.size(); i++) {
Student s =array.get(i);
if(s.getSid().equals(sid)) {
flag = true;
break;
}
}
return flag;
}
//创建查看全班同学姓名的方法
public static void seeStudent(ArrayList<Student> array) {
//这里判断集合本身有无内容,但好像有点问题
if(array.size() == 0) {
System.out.println("无信息,请先添加学生");
return;
}
System.out.println("学号\t\t\t姓名\t\t年龄");
for(int i = 0; i<array.size(); i++) {
Student s = array.get(i);
System.out.println(s.getSid() + "\t\t\t" + s.getName() + "\t" + s.getAge());
}
}
//创建方法,随机点名
public static void getStudent(ArrayList<Student> array) {
//生成随机数
Random r = new Random();
System.out.println(r.nextInt(array.size()));
System.out.println(array.get(r.nextInt(array.size())).getName());
}
}
这一关新学到的知识:
1.退出系统的编写可以直接写一个 System.exit(0),就完成退出的编写了
2.next和nextLine,当前面有键入nextInt的时候,后面键入就不可以写nextLine,要写成next,因为写成nextLine的话,只会读入但并没有返回,小白是用nextLine的时候第一个同学的姓名不可以键入,会自己跳出,这个方法是同学告诉的,至于原理我还不太清楚。