我的已提交代码,来抛砖引玉,同时请教关于scanner的问题
我在控制台输出了一句语句,接下来又要用new Scanner(System.in).next();来接受数据,但这个接受的数据有时会被我之前输出的语句影响,请问这是为什么,怎么处理?
//以下为我的代码,我没仔细看那个播放器的案例,没有用list<entry<k,v>>()的方法
//主要逻辑没有问题,测试了大部分功能
import java.util.Scanner;
public class TestDemo {
public static void startMenu() {
System.out.println("-------------------------------------------------- ");
System.out.println("-----------欢迎来到简单学生管理系统---------------- ");
System.out.println(" 1--班级管理 ");
System.out.println(" 2--学校管理 ");
System.out.println(" 0--安全退出 ");
System.out.println("------------------------------------------------- ");
}
public static void schoolMenu() {
System.out.println("----------------------------------------------- ");
System.out.println(" ***学校管理*** ");
System.out.println(" 1--创建班级 ");
System.out.println(" 2--删除班级 ");
System.out.println(" 3--通过班级名称查询班级信息 ");
System.out.println(" 4--对各班语文成绩按平均分由大到小进行排序 ");
System.out.println(" 5--对各班数学成绩按平均分由大到小进行排序 ");
System.out.println(" 6--显示所有班级名称 ");
System.out.println(" 9--返回上一级菜单 ");
System.out.println("----------------------------------------------- ");
}
public static void banjiMenu() {
System.out.println("----------------------------------------------- ");
System.out.println(" ***班级管理*** ");
System.out.println(" 1--添加学生信息到主学生列表");
System.out.println(" 2--添加学生信息到普通班级");
System.out.println(" 3--通过学号查询学生信息");
System.out.println(" 4--输入班级的语文成绩");
System.out.println(" 5--输入班级的数学成绩");
System.out.println(" 6--删除学生信息");
System.out.println(" 7--显示所有学生信息");
System.out.println(" 9--返回上一级菜单");
System.out.println("----------------------------------------------- ");
System.out.println("请输入对应数字进行班级列表管理");
}
//以下三个方法为各类测试方法,实际没怎么用,用处不大
public void studenttest() {
Student s1=new Student("s001","李狗蛋");
Student s2=new Student("s002","赵铁柱");
Student s3=new Student("s003","王二麻子");
Student s4=new Student("s001","李狗蛋");
System.out.println(s1);
}
public void banjitest() {
Student s1=new Student("s001","李狗蛋");
Student s2=new Student("s002","赵铁柱");
Student s3=new Student("s003","王二麻子");
Student s4=new Student("s001","李狗蛋");
Banji bj1=new Banji("B01","宇智波斑");
bj1.addStudent(s1);
bj1.addStudent(s2);
bj1.addStudent(s3);
bj1.addStudent(s4);
bj1.insertChineseScore(s1.getStuNum(), 68f);
bj1.insertChineseScore(s2.getStuNum(), 87f);
bj1.insertChineseScore(s3.getStuNum(), 76f);
bj1.displayAllStudent();
}
public void schooltest() {
}
public static void main(String[] args) {
School school=new School();//先初始化一个学校实例出来
Scanner sc=new Scanner(System.in);
while(true) {
TestDemo.startMenu();
String str=sc.next();
switch(str) {
case "1"://班级菜单
boolean banjigetOut=false;
while(true) {
if(banjigetOut) {
break;
}//返回上一级菜单
TestDemo.banjiMenu();
String strbanji=sc.next();
switch(strbanji) {
case "1":
System.out.print("请输入要添加的学生信息个数:");
int snum;
try {
snum = sc.nextInt();
if(snum<0) {
System.out.println("学生数量不能少于零个,默认自动返回");
break;
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
//e.printStackTrace();
System.out.println("您输入的不合法,自动返回");
break;
}
for(int i=0;i<snum;i++) {
System.out.println("请输入要添加学生的姓名:");
String stuname1=sc.next();
System.out.println("请输入要添加学生的学号:");
String stunum1=sc.next();
Student stu1=new Student(stunum1,stuname1);
boolean bBanjiOne=false;
for(Student stu:school.getmainlist()) {
if(stu1.equals(stu)) {
System.out.println("该学生已经在主列表中!");
bBanjiOne=true;
break;
}
}
if(!bBanjiOne) {
school.getmainlist().add(stu1);
System.out.println("添加成功");
}
}
school.displaymainlist();
break;
case "2"://为了简便处理,遇到非法输入直接返回上一级
if(school.getschoolmap().size()==0) {
System.out.println("尚未创建班级,请返回上一级菜单于学校管理内创建班级!");
break;
}
System.out.println("添加学生信息到普通班级");
System.out.println("请输入要添加的班级名称");
String inputofbanjiname=sc.next();//变量命名都应该是这种易懂的变量名,前面的就懒得改了
if(!school.getschoolmap().containsKey(inputofbanjiname)) {
System.out.println("该学校内不包含该班级");
break;
}else {
System.out.print("请输入要添加的学生信息个数:");
int snum1;
try {
snum1 = sc.nextInt();
if(snum1<0) {
System.out.println("学生数量不能少于零个,默认自动返回");
break;
}
if(snum1>school.getmainlist().size()) {
System.out.println("输入的学生数量不能多于主列表的人数!默认返回!");
break;
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
//e.printStackTrace();
System.out.println("您输入的不合法,自动返回");
break;
}
for(int i=0;i<snum1;i++) {//直接复制于前面八十多行
System.out.println("请输入要添加学生的姓名:");
String stuname1=sc.next();
System.out.println("请输入要添加学生的学号:");
String stunum1=sc.next();
Student stu1=new Student(stunum1,stuname1);
if(school.getmainlist().contains(stu1)) {
school.getschoolmap().get(inputofbanjiname).addStudent(stu1);
}else {
System.out.println("该学生不在主列表中,跳过该学生!");
//此处为了防止添加人数大于主列表人数的死循环,已于前面处理
//不用i--是为了防止陷入意外死循环
}
}
}
school.displaymainlist();
break;
case "3":
System.out.println("通过学号查询学生信息");
if(school.getschoolmap().size()==0) {
System.out.println("尚未创建班级,请返回上一级菜单于学校管理内创建班级!");
break;
}
System.out.println("请输入要查询的班级名称:");
String inputofchaxunBanji;
try {
inputofchaxunBanji=sc.next();
} catch (Exception e) {
// TODO 自动生成的 catch 块
//e.printStackTrace();
System.out.println("您的输入不合法,默认返回上一级");
break;
}
if(school.getschoolmap().containsKey(inputofchaxunBanji)) {
System.out.println("请输入要查询的学生的id(学号)");
String inputofchaxunStudentid=sc.next();
if(school.getschoolmap().get(inputofchaxunBanji).searchStudentByNum(inputofchaxunStudentid)==null) {
System.out.println("该学生信息在"+inputofchaxunBanji+"不存在!");
}else {
System.out.println(inputofchaxunBanji+"学生:"+
school.getschoolmap().get(inputofchaxunBanji).searchStudentByNum(inputofchaxunStudentid));
}
}else {
System.out.println("班级不存在,默认返回上一级");
}
break;
case "4":
System.out.println("输入班级的语文成绩");
if(school.getschoolmap().size()==0) {
System.out.println("尚未创建班级,请返回上一级菜单于学校管理内创建班级!");
break;
}
System.out.println("请输入班级名称:");
String inputofchaxunBanji1;
try {
inputofchaxunBanji1=sc.next();
} catch (Exception e) {
// TODO 自动生成的 catch 块
//e.printStackTrace();
System.out.println("您的输入不合法,默认返回上一级");
break;
}
if(school.getschoolmap().containsKey(inputofchaxunBanji1)) {
for(Student stu:school.getschoolmap().get(inputofchaxunBanji1).getstuList()) {
System.out.println(stu);
System.out.println("请输入该学生的语文成绩:");
float f=0;
try {
f=sc.nextFloat();
}catch (Exception e) {
System.out.println("您的输入不合法,默认返回上一级");
break;
}
stu.setChinese(f);
System.out.println("添加语文成绩成功");
}
}else {
System.out.println("不存在该班级!");
}
break;
case "5":
System.out.println("输入班级的数学成绩");
if(school.getschoolmap().size()==0) {
System.out.println("尚未创建班级,请返回上一级菜单于学校管理内创建班级!");
break;
}
System.out.println("请输入班级名称:");
String inputofchaxunBanji2="";
try {
inputofchaxunBanji2=sc.next();
} catch (Exception e) {
// TODO 自动生成的 catch 块
//e.printStackTrace();
System.out.println("您的输入不合法,默认返回上一级");
break;
}
if(school.getschoolmap().containsKey(inputofchaxunBanji2)) {
for(Student stu:school.getschoolmap().get(inputofchaxunBanji2).getstuList()) {
System.out.println(stu);
System.out.println("请输入该学生的数学成绩:");
float f=0;
try {
f=sc.nextFloat();
}catch (Exception e) {
System.out.println("您的输入不合法,默认返回上一级");
break;
}
stu.setChinese(f);
System.out.println("添加数学成绩成功");
}
}else {
System.out.println("不存在该班级!");
}
break;
case "6":
System.out.println("删除学生信息");
if(school.getschoolmap().size()==0) {
System.out.println("尚未创建班级,请返回上一级菜单于学校管理内创建班级!");
break;
}
System.out.println("请输入班级名称:");
String inputofchaxunBanji3="";
try {
inputofchaxunBanji3=sc.next();
} catch (Exception e) {
// TODO 自动生成的 catch 块
//e.printStackTrace();
System.out.println("您的输入不合法,默认返回上一级");
break;
}
if(school.getschoolmap().containsKey(inputofchaxunBanji3)) {
System.out.println("请输入要删除学生的id(学号):");
String inputofStudentnum=sc.next();
school.getschoolmap().get(inputofchaxunBanji3).deleteStudent(inputofStudentnum);
System.out.println("删除工作完成");
}else {
System.out.println("不存在该班级!");
}
break;
case "7":
school.displaymainlist();
break;
case "9":
System.out.println("返回上一级菜单");
banjigetOut=true;
break;
default :
System.out.println("没有对应的指令!");
break;
}//班级菜单级
}
break;
case "2"://学校菜单
boolean schoolgetOut=false;
while(true) {
if(schoolgetOut)break;
TestDemo.schoolMenu();
String str2=sc.next();
switch(str2) {
case "1":
System.out.println("创建班级");
System.out.println("请输入要创建班级的id:");
String inputofbanjiId=sc.next();
//sc.next();
System.out.println("请输入要创建班级的名称:");
String inputofbanjiname=sc.next();
//sc.next();
school.addBanji(new Banji(inputofbanjiId,inputofbanjiname));
break;
case "2":
System.out.println("删除班级");
System.out.println("请输入要删除班级的名称:");
String inputofDeleteBanji=sc.next();
if(school.getschoolmap().containsKey(inputofDeleteBanji)) {
school.deleteBanji(school.getschoolmap().get(inputofDeleteBanji));
System.out.println("删除操作完成");
}else {
System.out.println("不存在该班级");
}
break;
case "3":
System.out.println("通过班级名称查询班级信息:");
String inputofbanjiChaXun=sc.next();
if(school.getschoolmap().containsKey(inputofbanjiChaXun)) {
school.getschoolmap().get(inputofbanjiChaXun).displayAllStudent();
}else {
System.out.println("查询的班级不存在!");
}
break;
case "4":
if(school.getschoolmap().size()==0) {
System.out.println("还未创建班级!");
break;
}
boolean fourB=false;
for(String striteam:school.getschoolmap().keySet()) {
if(school.getschoolmap().get(striteam).getstuList().size()==0) {
System.out.println("部分班级内没有成员!");
fourB=true;
break;
}
}
if(fourB)break;
System.out.println("对各班语文成绩按平均分进行由大到小排序");
school.sortChineseByAverage();
break;
case "5":
if(school.getschoolmap().size()==0) {
System.out.println("还未创建班级!");
break;
}
boolean fifthB=false;
for(String striteam:school.getschoolmap().keySet()) {
if(school.getschoolmap().get(striteam).getstuList().size()==0) {
System.out.println("部分班级内没有成员!");
fifthB=true;
break;
}
}
if(fifthB)break;
System.out.println("对各班数学成绩按平均分进行由大到小排序");
school.sortMathByAverage();
break;
case "6":
System.out.println("显示所有班级名称:");
school.displayBanJiName();
break;
case "9":
System.out.println("返回上一级菜单");
schoolgetOut=true;
break;
default:
System.out.println("无效指令!");
}
}
break;
case "0":
System.out.println("已经安全退出!");
return;
default:
System.out.println("没有对应的指令!");
break;
}//初始菜单级
}
}
}
//-------------------------------------------------------------------------------
public class Student {
private String stuNum;//id
private String stuName;
private float math=0;
private float chinese=0;
/**
* 全属性构造方法
* @param stuNum
* @param stuNmae
* @param math
* @param chinese
*/
public Student(String stuNum,String stuName,float math,float chinese) {
this.setStuNum(stuNum);
this.setStuName(stuName);
this.setMath(math);
this.setChinese(chinese);
}
public Student(String stuNum,String stuName) {
this.setStuName(stuName);
this.setStuNum(stuNum);
}
//四组get和set
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public float getMath() {
return math;
}
public void setMath(float math) {
if(math>0&&math<100){
this.math = math;
}else {
System.out.println("输入的数学成绩不合适,默认为60");
this.math=60;
}
}
public float getChinese() {
return chinese;
}
public void setChinese(float chinese) {
if(chinese>0&&chinese<100) {
this.chinese = chinese;
}else {
System.out.println("输入的语文成绩不合适,默认为60");
this.chinese=60;
}
}
/*
* eclipse辅助生成的hashcode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Float.floatToIntBits(chinese);
result = prime * result + Float.floatToIntBits(math);
result = prime * result + ((stuName == null) ? 0 : stuName.hashCode());
result = prime * result + ((stuNum == null) ? 0 : stuNum.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {//只是不允许同学号,可以同姓名
if(this==obj)return true;
if(this.getClass()==Student.class) {
Student s=(Student)obj;
if(this.getStuNum().equals(s.getStuNum()))return true;
}
return false;
}
@Override
public String toString() {
return "学生学号:" + stuNum + ", 学生姓名:" + stuName ;
}
// public String toString() {
// return "学生学号:" + stuNum + ", 学生姓名:" + stuName + " 其数学成绩" + math + ",语文成绩:" + chinese ;
// }
}
//--------------------------------------------------------------------------------------
import java.util.ArrayList;
import java.util.List;
public class Banji {
private String classid;
private String classname;//班级名称作为学校类内部的map的key值
private List<Student> stuList=new ArrayList<Student>();
/**
* 双属性构造方法
* @param classid
* @param classname
*/
public Banji(String classid,String classname) {
this.setClassid(classid);
this.setClassname(classname);
}
//用于school类的排序而产生的get方法,
public List<Student> getstuList(){
return stuList;
}
//两组get和set
public String getClassid() {
return classid;
}
public void setClassid(String classid) {
this.classid = classid;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
/*
* 学生的添加和学生是否和存在于班级中的具体逻辑由业务判断
* 这里就简单的这么写
*/
public void addStudent(Student stu) {
for(Student iteam:stuList) {
if(iteam.equals(stu)) {
System.out.println("该学生"+stu.getStuName()+"学号"+stu.getStuNum()+"已在该班级中!");
return;
}
}
stuList.add(stu);
}
// 通过学号查询学生在班级中是否存在
public Student searchStudentByNum(String stuNum){
Student stu=null;
for(Student iteam:stuList) {
if(iteam.getStuNum().equals(stuNum)) {
stu=iteam;
}
}
return stu;
}
// 输入班级学生的语文成绩:
public void insertChineseScore(String stuNum,float score){
Student stu=searchStudentByNum(stuNum);
if(stu==null) {
System.out.println("该学生"+stuNum+"不存在");
}else {
stu.setChinese(score);
}
}
//输入班级学生的数学成绩:
public void insertMathScore(String stuNum,float score){
Student stu=searchStudentByNum(stuNum);
if(stu==null) {
System.out.println("该学生"+stuNum+"不存在");
}else {
stu.setMath(score);;
}
}
//删除学习信息:
/*
* ArrayList的remove方法好像有带有Boolean返回值的重载方法 这么写貌似复杂了
*/
public void deleteStudent(String stuNum){
Student stu=searchStudentByNum(stuNum);
if(stu==null) {
System.out.println("该学生"+stuNum+"本来就不存在,无法删除");
return;
}
stuList.remove(stu);
}
//显示所有学生的信息(包括学号和姓名):
public void displayAllStudent(){
System.out.println(this.getClassname()+"有以下学生:");
for(Student stu:stuList) {
System.out.println(stu);
}
System.out.println("------分割线-----------");
}
}
//-----------------------------------------------------------------------
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class School {
private Map<String, Banji> schoolMap=new HashMap<>();
private List<Student> mainList=new ArrayList<>();//用于存放所有学生的信息
/*
* 弄这个getmainlist是为了能向主列表中添加学生成员
* 原本打算遍历班级,但菜单中有直接向主列表中添加的需求,就直接定义了这个方法
*/
public synchronized List<Student> getmainlist() {
return mainList;
}
//用于主方法获得班级
public synchronized Map<String,Banji> getschoolmap(){
return schoolMap;
}
/**
* 班级类name唯一(由查询方法联动决定)
*/
public School() {
//无参构造方法
}
//添加班级:
public void addBanji(Banji banji){
Banji b=searchByName(banji.getClassname());
if(!(b==null)) {
System.out.println("该班级已存在!");
return;
}
schoolMap.put(banji.getClassname(), banji);
System.out.println("添加班级成功!\n");
}
//删除班级 :
public void deleteBanji(Banji banji){
if(this.getschoolmap().containsKey(banji.getClassname())) {
schoolMap.remove(banji.getClassname());
System.out.println("删除成功");
}else {
System.out.println("不存在该班级!");
}
}
//通过班级名称查询班级:
public Banji searchByName(String className) {
Banji b=null;
Set<String> set=schoolMap.keySet();
for(String str:set) {
if(str==className) {
b=schoolMap.get(str);
}
}
return b;
}
//对各班语文成绩按平均分进行由大到小排序:
public void sortChineseByAverage() {
Map<Float,String>mOne=new HashMap<>();
for(String str:schoolMap.keySet()) {
float f=0;
for(Student stuIteam:(schoolMap.get(str)).getstuList()) {
f+=stuIteam.getChinese();
}
if(f==0) {
System.out.println("班级内有部分同学未录入数据!");
return;
}
f=f/((schoolMap.get(str)).getstuList()).size();//获得该班级的语文平均成绩f
mOne.put(f, str);
}
float[] fArr=new float[mOne.size()];
int ii=0;
for(float f:mOne.keySet()) {
fArr[ii++]=f;
}
Arrays.sort(fArr);//sort方法是从小到大排序
System.out.println("各班语文成绩从大到小为:");
for(int i=fArr.length-1;i>=0;i--) {
System.out.println(mOne.get(fArr[i])+"的平均分:"+fArr[i]);
}
}
//对各班数学成绩按平均分进行由大到小排序:
public void sortMathByAverage() {
Map<Float,String>mOne=new HashMap<>();
for(String str:schoolMap.keySet()) {
float f=0;
for(Student stuIteam:(schoolMap.get(str)).getstuList()) {
f+=stuIteam.getMath();
}
if(f==0) {
System.out.println("班级内有部分同学未录入数据!");
return;
}
f=f/((schoolMap.get(str)).getstuList()).size();//获得该班级的数学平均成绩f
mOne.put(f, str);
}
float[] fArr=new float[mOne.size()];
int ii=0;
for(float f:mOne.keySet()) {
fArr[ii++]=f;
}
Arrays.sort(fArr);//sort方法是从小到大排序
System.out.println("各班数学成绩从大到小为:");
for(int i=fArr.length-1;i>=0;i--) {
System.out.println(mOne.get(fArr[i])+"的平均分:"+fArr[i]);
}
}
//显示所有班级名称:
public void displayBanJiName() {
for(String str:schoolMap.keySet()) {
System.out.println(str);
}
}
//显示主列表的所有学生
public void displaymainlist() {
for(Student stu:mainList) {
System.out.println(stu);
}
}
}
正在回答
同学你好,这是eclipse工具的问题,同学将光标移动到一下行即可。如下所示:
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
同学你好,1. 添加学生信息到普通列表时,当输入的学生编号在主学生列表中存在时,应该直接添加到普通班级中,不需要重新输入学生姓名。当输入的学生编号在主学生列表中不存在时,提示不存在要求输入学生姓名,或进行提示。修改后代码如下所示:
2. 添加数学成绩失败,建议同学在case5中调用setMath()方法。修改后代码如下所示:
3. 同学描述的是否是如下图中出现的情况,如果是,则是因程序没有加载过来,同学不需要在意,可以忽略。如果不是,则建议同学重新描述一下问题,便于老师定位问题。
注:同学的方式可以完成此作业,不过建议同学复习一下案例。
祝学习愉快!
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星