从用户输入String向数组添加数据

时间:2014-11-21 17:01:27

标签: java arrays

我正在创建一个程序,该程序应该让用户输入一个包含学生姓名的字符串,然后是他们的测验,作业和考试成绩(用户输入确定学生每个人的数量)并获取每个数据并将其添加到数组中。

我打算通过4个不同的阵列来做到这一点:名称为1,HW得分为1,测验得分为1,考试成绩为1。

它的工作原理是为每个学生输入名称,然后是每个学分前面的分数,表示它是什么类型的分数。例如:

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10
Joe Smith: q10 q10 h7 h10 h9 h10 e80

让程序将每个名称存储在一个数组中似乎很容易,但我正在努力使它能够将它拉到e100,e95等,并将它们放入检查数组中。我到目前为止的代码显然不会这样做,而是设置为按照输入的顺序为每个数组添加一个整数:

import java.util.Scanner;

public class GradeBook {

    public static void main(String[] args) {

        Scanner s = new Scanner (System.in);

        System.out.println("Welcome to GradeBook!");
        System.out.println("Please provide grade item details");

        System.out.print("Exams (number, points, weight): ");
        int numExam = s.nextInt();
        int examPoints = s.nextInt();
        int examWeight = s.nextInt();

        System.out.print("Quizzes (number, points, weight): ");
        int numQuiz = s.nextInt();
        int quizPoints = s.nextInt();
        int quizWeight = s.nextInt();

        System.out.print("Homework (number, points, weight): ");
        int numHomework = s.nextInt();
        int homePoints = s.nextInt();
        int homeWeight = s.nextInt();

        System.out.println("------------------");

        String names[] = new String [200];
        int examScores[] = new int [200 * numExam];
        int quizScores[] = new int [200 * numQuiz];
        int homeworkScores[] = new int [200 * numHomework];

        int students = 0;
        int e = 0;
        int h = 0;
        int q = 0;


    for (;;){


        System.out.println("What would you like to do?");
        System.out.println("1 Add student data");
        System.out.println("2 Display student grades & statistics");
        System.out.println("3 Plot grade distribution");
        System.out.println("4 Quit");

        int input = s.nextInt();
        s.nextLine();

        if(input == 1){

            for(int i = 0; i <= students;){
                for (boolean done = false;done = true;){
                    System.out.println("Enter student data: ");
                    System.out.print("data>");
                    names[i] = s.next();
                    examScores[e] = s.nextInt(); 
                    quizScores[q] = s.nextInt();
                    homeworkScores[h] = s.nextInt();

edit1:权重

这是用户在程序开始时输入“成绩项目详细信息”的方式:

考试(数量,分数,体重):3 100 60(用户按下输入)

测验(数字,分数,重量):3 10 20(用户按下回车)

家庭作业(数量,点数,体重):3 10 20(用户按下输入)

第一个数字是课程中考试/测验/作业的数量,第二个数字是每个考试/测验/作业的最大分数,第三个数字是最终成绩中考试/测验/作业的重量。

2 个答案:

答案 0 :(得分:1)

您可以尝试将用户输入存储为字符串,然后使用split(),但我认为使用StringTokenizer来解析学生姓名和分数会更好:https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

将学生姓名与分数分开后,您可以查看每个分数的第一个字符;如果字符是“e”,则将数字部分添加到检查数组中;如果它是“q”,则添加到测验数组; “h”进入作业阵列。

一些一般性建议:

我建议您启用该程序,以便逐行输入学生数据,直到用户输入“END”或其他关键字为止。

您设置阵列的方式,无法分辨哪个学生得分。您需要能够为程序的其他部分执行此操作。我建议创建一个将每个学生作为对象的Student类,并将分数记录为int数组。

您可以将学生数据信息存储在哈希映射中,但我认为使用数组更适合您的级别。

一旦你设置了Student课程,你就可以创建一个Student数组(称之为“教室”或类似的东西)。这个教室阵列的最大大小为200或无论学生的最大数量是多少。每当您为新学生添加分数时,您应该将相应的学生对象添加到教室阵列并记下他们的学生ID。添加的第一个学生的学生ID为1,第二个学生的ID为2,依此类推。这样您就可以轻松为现有学生添加更多分数。您必须以不同方式解析用户输入以解决此更改。

学生数据的用户输入现在可以采用以下形式:

  • [studentName]:[score1,score2,...]

  • [studentID]:[score1,score2,...]

示例:

(第一次输入学生数据)

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10

(用户按ENTER)

  

&GT; Bob Jones有StudentID 1.输入更多学生数据或“结束”。

Joe Smith: q10 q10 h7 h10 h9 h10 e80

然后,如果您想为现有学生添加更多分数,您可以使用他们的学生ID来引用他们,以便

1: e90 h7 q8 q9 h10

会将这些分数添加到学生ID为1的学生中,这将是Bob Jones。由于数组从0开始,每个学生的学生ID将比数组中的索引多1(学生1将在索引0,学生2在索引1,等等)。另一种(更复杂,效率更低)的方法是根据数组中的每个元素检查学生姓名,如果学生已经存在则添加更多分数,否则添加新学生对象。

由于您无法更改数组的大小,因此当您向用户询问每个学生的考试,测验和家庭作业总数时,您可能会遇到问题,假设您将分数作为Student类的变量实现。你应该查看数组和arraylist之间的差异。确保阻止用户添加比开头指定的分数更多的分数。

答案 1 :(得分:0)

如果输入

Bob Jones: e100 e95 e87 q10 q10 q8 h10 h10 h10

你用以下方法恢复它:

names[i] = s.next();
examScores[e] = s.nextInt(); 
quizScores[q] = s.nextInt();
homeworkScores[h] = s.nextInt();

它永远不会工作......分数不是你的例子中的整数(它们是一个字符串),你必须解析字符串并拆分它:

String readString = s.next(); // "e99"
char type = readString.charAt(0); // "e"
String sScore = readString.substring(1); // "99"
int score = Integer.valueOf(sScore);  // 99

[上面的代码尚未经过测试]

(见https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

一般来说,您的代码很难理解,我认为这个问题并不完整。

  • 尝试使用方法并评论关键线
  • 使用常数200(我想象它是学生人数)
  • 创建对象(学生,分数,......)
  • 使用java对象(HashMaps,Lists,...)
  • 使用switch / case而不是if(input == 1)
祝你好运!开始编程可能很难,但很快就会很惊人。