我正在学习java并从课程开始,我现在有些疑惑。
我打算用学生,班级和椅子的数据制作节目。例如,来自学生数据的信息将用于教室和椅子。现在,我将自己限制在班级学生身上。
每个学生都有姓名和出生日期。 我以为我会创建一个包含学生数据的课程,然后将学生的数据保存在两个数组中。名称的一维字符串数组和日期(年,月,日)的三列数组。
我首先使用代码创建Student类:
public class Stundent{
private String nameStudent;
private int yearBirth;
private int monthBirth;
private int dayBirth;
public void setName(String name){
System.out.println("Insert student's name:");
nameStudent = name;
}
public String getName(){
return nameStudent;
}
public void setYear(int year){
System.out.println("Insert student's year of birth:");
yearBirth = year;
}
public int getYear(){
return yearBirth;
}
public void setMonth(int month){
System.out.println("Insert student's month of birth:");
monthBirth = month;
}
public int getMonth(){
return monthBirth;
}
public void setDay(int day){
System.out.println("Insert student's day of birth:");
dayBirth = day;
}
public int getDay(){
return dayBirth;
}
}
然后在主文件中想到了这样:
Student person = new Student();
String[] nameStudents = new String[100];
int[][] birthdayStudents = new int[100][3];
for (int i = 0; i < 3; i++){
person.setName(sc.nextLine());
nameStudents[i] = person.getName();
person.setAno(sc.nextInt());
birthdayStudents[i][1] = person.getAno();
person.setMes(sc.nextInt());
birthdayStudents[i][1] = person.getMes();
person.setDia(sc.nextInt());
birthdayStudents[i][2] = person.getDia();
}
第一个问题:
忘记这是因为扫描仪无法正常工作,这是正确的思考方式吗?
第二个问题:
如果我运行此代码,我会遇到以下情况: 它将呈现给我“插入学生的名字:”但如果我放置Maria InputMismatchException将会出现。我相信他会在这一年里存放Maria。 为什么会这样?在相同的循环中,我不能多次调用扫描仪? 如果我只输入代码:
person.setName(sc.nextLine());
nameStudents[i] = person.getName();
并删除有关生日的一切其他工作正常。 谁能开导我?
答案 0 :(得分:1)
我认为这不是你做的正确方法。您将实体学生与输入相关信息混合在一起。我按照以下方式重新设计了它(稍微减少了学生):
/* just an entity, no logic at all */
public class Student {
private String name = null;
private Integer year = null;
public void setName(String name){
this.name = name;
}
public void setYear(Integer year){
this.year = year;
}
}
获取用户输入的逻辑:
List<Student> students = new ArrayList<Student>();
int numberOfStudents = 3;
for (int i = 0; i < numberOfStudents; i++){
System.out.println("Please enter name:");
String name = sc.nextLine();
System.out.println("Please enter year:");
Integer year = sc.nextInt();
/* after gathering the input create student */
Student s = new Student();
s.setName(name);
s.setYear(year);
students.add(s);
}
答案 1 :(得分:0)
如何将Student对象本身保存在列表中呢?
List<Student> studentList = new ArrayList<Student>();
studentList.add(student);
此外,当您从扫描仪中检索信息时,请将这些信息(如姓名,年龄等)分配给临时对象,以便对其进行一些验证。
String temp = sc.nextLine();
验证“temp”,如果它是您想要存储在此人姓名中的内容,则从该人的班级中调用setter。
在对象上调用任何setter方法之前验证用户输入始终是个好主意。
答案 2 :(得分:0)
您似乎正在划分在主要区块中的代码与Stundent
(注意拼写错误)类中的代码之间收集信息的责任。
我会专注于思考类的职责是什么,并确保类中没有额外的代码,而这些代码不直接处理该类的响应性。例如,如果Student
要保持其名称,则名称字段应该在Student
内(您这样做了,这很有意义)。但是,如果要更新学生的名称,Student
通过println
语句提示在您为其指定了一个名称之后,它正在期待一个名称是没有意义的。 / p>
也许您需要一个StudentReader
类,它可以读取输入,然后构造Student
对象。这样的读者将具有完成所有正确的提示和读取值的唯一责任,最终结果是单个构造的Student
。然后主要部分基本上是一个循环来读取每个学生StudentReader
和一个部分来收集阅读Student
并相应地处理它们。