【问题标题】:I need to take data from input and create a Student class with Students grades in an array我需要从输入中获取数据并在数组中创建一个包含学生成绩的学生类
【发布时间】:2020-03-24 20:00:59
【问题描述】:

我在创建学生班级时遇到问题。 我的输入文件是这样的:

3 //number of exams
Audrey 7 28 1
Eddie 27 19 7
Addison 6 23 31
Stephanie 29 21 7
Laura 19 30 17

我需要使用一个构造函数创建一个学生类,例如 public Student(String name, int[] Student Grades).

问题是我无法创建一个 3 年级的学生, 我需要创建: 成绩为 [7, 28, 1] 的学生 Audrey 或学生 1 的姓名 Audrey 成绩[7,28,1]

我试过但不能为第一个学生放置前 3 个变量。

我该怎么做?

更新了我的工作:

File file = new File("info1.txt");
Scanner input = new Scanner(file);
int []grade = new int[3];
int counter = 0;
Student[] students = new Student[9];

while(input.hasNext()) {

    String Studentread= input.nextLine();
    for (int i = 0; i < grade.length; i++) {
        grade [i] = input.nextInt();
    }
    System.out.println(grade.toString());
    students[counter] = new Student(Studentread, grade);
    System.out.println(students[counter].getName() + " " + students[counter].getStudentGrades());
    counter++;

    input.close();
}

班学生:

private String Name;
public int [] StudentGrades;

public Student(String name, int[] StudentGrades) {

this.Name = name;
    this.StudentGrades = StudentGrades;
}

public String getName() {
    return Name;
}
public void setName(String name) {
    Name = name;
}

public int[] getStudentGrades() {
    return StudentGrades;
}
public void setStudentGrades(int[] studentGrades) {
   StudentGrades = studentGrades;
}

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 欢迎来到 SO @Alihan - 请注意格式化 How do I format my posts using Markdown or HTML 的约定。注意正确的代码缩进(见我的编辑)。
  • 还显示您创建input 它是文件行上的迭代器吗?这:int[] Grades = input.nextInt() 可能无法编译,nextInt() 返回一个 int,您尝试将其分配给数组。
  • 这是我的主要问题。我不能将学生姓名之后的整数放入 Grades 数组。我需要自动执行此操作。当我不从文件中读取时,它很容易。
  • @AlihanAydın 您需要使用循环并调用input.nextInt(); 3 次,这将给您 3 个整数,您可以将它们放入您的成绩数组中

标签: java arrays class oop arraylist


【解决方案1】:

您可以逐行读取并使用空格分隔符将行拆分为数组。或者用空格解析红线。

【讨论】:

  • 请尝试用一些代码来解释你的答案。理解起来会很有帮助。
  • 我在哪里可以得到这样的例子?
  • @Bentaye 代码解释了我在上述解决方案中的意思。
【解决方案2】:

最好逐行读取文件,而不是使用Scanner 逐个标记。 这是因为每一行在您的文件中都有含义。并直接匹配到Student

我对代码进行了注释,以便您了解每一行的作用:

public static void main(String[] args) throws IOException {

    // read all the lines of your file
    List<String> lines = Files.readAllLines(Paths.get("info1.txt"));

    // first line is the number of exams
    int nbExams = Integer.valueOf(lines.get(0).trim());

    // remove first line, now each line is a student
    lines.remove(0);
    int nbStudents = lines.size();

    Student[] students = new Student[nbStudents];
    for(int iStudents = 0; iStudents<nbStudents; iStudents++) {
        String line = lines.get(iStudents);

        // split your line on spaces
        String[] tokens = line.split(" ");

        // first is name
        String studentName = tokens[0];

        // next are studentGrades
        int[] grades = new int[nbExams];
        for(int i=0; i<nbExams; i++) {
            grades[i] = Integer.valueOf(tokens[i+1]);
        }

        students[iStudents] = new Student(studentName, grades);
    }

    System.out.println(Arrays.toString(students));
}

注意事项:

  • 始终使用小写字母作为变量的第一个字母(studentGrades,而不是 StudentGrades)。大写字母保留给类和接口
  • 为您的学生班级添加一个toString 方法,以便您可以很好地打印它们
  • 您不需要在 Student 类上设置设置器,因为您在构造函数中提供了所有数据。

Student 类应该是这样的:

class Student {
    private String name;
    private int[] studentGrades;

    public Student(String name, int[] studentGrades) {
        this.name = name;
        this.studentGrades = studentGrades;
    }

    public String getName() {
        return name;
    }

    public int[] getStudentGrades() {
        return studentGrades;
    }

    @Override
    public String toString() {
        return "Student{" +
                  "name=" + name + ", " +
                  "studentGrades=" + Arrays.toString(studentGrades) +
                "}";
    }
}

【讨论】:

  • 谢谢。但仍然出现错误:线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“Audrey 7 28 1”在 java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.base /java.lang.Integer.parseInt(Integer.java:652) 在 java.base/java.lang.Integer.valueOf(Integer.java:983) 在 Ass.main(Ass.java:15)
  • 您的档案中有考试数量吗?第一行的数字。好像你的第一行是Audrey 7 28 1
  • 对不起,我忘了我改变了。但我仍然收到错误消息:线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:索引 1 超出长度 1
  • 好的,现在可以了。但是我如何查看学生的信息?像 student1.getgrades 或 getname。谢谢。
  • students[0].getName()students[0].getStudentGrades()[0]students[0].getStudentGrades()[1]students[0].getStudentGrades()[2] 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2020-10-19
  • 2022-08-18
相关资源
最近更新 更多