繁体   English   中英

无法获取 object 阵列的输入

[英]Trouble getting input for object array

我正在尝试创建一个 class 来接收有关人名、考试科目和考试分数的数据。 到目前为止,我有这些课程:

考试:

public class APExam {
   //instance variables
   private String mySubject;
   private int myScore;
   
   //constructors
   public APExam(String subject, int score) {
      mySubject = subject;
      myScore = score;
   }
   public APExam() {
      mySubject = "";
      myScore = 1;
   }
   
   //getters and setters
   public void setSubject(String s) {
      mySubject = s;
   }
   public String getSubject() {
      return mySubject;
   }
   public void setScore(int score) {
      myScore = score;
   }
   public int getScore() {
      return myScore;
   }
   
   //compareTo
   public String compareTo(int s) {
      if(myScore == s)
         return "Scores are equal.";
      else if(myScore > s)
         return "The first score is greater than the second score.";  
      else 
         return "The second score is greater than the first score.";
   }
   
   //equals
   public boolean equals(String str) {
      return mySubject.equals(str);
   }
   
   //toString
   public String toString() {
      return "Subject: " + mySubject + "\nScore: " + myScore;
   }
}

AP学生:

public class APStudent {
   //instance variables
   private String myFirstName;
   private String myLastName;
   private ArrayList<APExam> myExams = new ArrayList<APExam>();
   
   //constructors
   public APStudent(String fname, String lname) {
      myFirstName = fname;
      myLastName = lname;
   }
   public APStudent() {
      myFirstName = "";
      myLastName = "";
   }
   
   //getters and setters
   public void setFirstName(String fname) {
      myFirstName = fname;
   } 
   public String getFirstName() {
      return myFirstName;
   }
   public void setLastName(String lname) {
      myLastName = lname;
   }
   public String getLastName() {
      return myLastName;
   }
   public ArrayList<APExam> getExams() {
      return myExams;
   }
   
   //addExam
   public void addExam(APExam ex) {
      myExams.add(ex);
   }
   
   //computeExamAverage
   public double computeExamAverage(List<APExam> exams) {
      int sum = 0;
      for(int i = 0; i < exams.size(); i++) {
         sum += exams.get(i).getScore();
      }
      return (double) sum / exams.size();
   }
   
   //findHighestExamScore
   public int findHighestExamScore(List<APExam> exams) {
      int max = exams.get(0).getScore();
      for(APExam ex : exams) {
         if(ex.getScore() > max) {
            max = ex.getScore();
         }
      }
      return max;
   }
   
   //numberOfFives
   public int numberOfFives(List<APExam> exams) {
      int fiveCount = 0;
      for(APExam ex : exams) {
         if(ex.getScore() == 5) {
            fiveCount++;
         }
      }
      return fiveCount;
   }
}

数组列表测试:

public class ArrayListTest {
   public static void main(String[] args) {
      //instance variables
      final String QUIT = "end";
      Scanner sc = new Scanner(System.in);
      ArrayList<APExam> myExams = new ArrayList<APExam>();
      APStudent student = new APStudent();
      String fname, lname, sub, input = "";
      int score;
      
      //prompt for info
      System.out.print("Enter first name: ");
      fname = sc.nextLine();
      student.setFirstName(fname);
      System.out.print("\nEnter last name: ");
      lname = sc.nextLine();
      student.setLastName(lname);
      while(!input.equals(QUIT)) {
         APExam ap = new APExam();
         System.out.print("\nEnter exam subject or 'end' to quit: ");
         input = sc.nextLine();
         sub = input;
         ap.setSubject(sub);
         System.out.print("\nEnter exam score: ");
         score = sc.nextInt();
         ap.setScore(score);
         student.addExam(ap);
         sc.nextLine();
         
      }
      
      //display information
      System.out.println(student.getExams());
      System.out.println("Name: " + student.getFirstName() + " " + student.getLastName());
      System.out.println("Exam average score: " + student.computeExamAverage(myExams));
      System.out.println("Highest score: " + student.findHighestExamScore(myExams));
      System.out.println("Number of fives: " + student.numberOfFives(myExams));
      
      System.out.println();
      
      
      for(int i = 0; i < myExams.size(); i++) {
         System.out.println(myExams.get(i));
      }
      
      //prompt for search
      System.out.println("1 sequential search" 
                        + "\n2 binary search"
                        + "\n3 exit");
      input = sc.nextLine();
      while(!((input.equals("1") || input.equals("2") || input.equals("3")))) {
         switch(input) {
            case "1":
               sequentialSearch(myExams, 3);
               break;
            case "2":
               binarySearch(myExams, 2);
               break;
            case "3":
               break;
         }
      }
   }
}

由于某种原因,在 ArrayListTest class 中,它不会使用输入的分数和科目创建 APExam object。 while循环有问题吗? 还是有其他问题?

您的问题是您出于某种原因将变量List<APExam> exams传递到您的函数中。 当您这样做时,您将传递一个空的ArrayList<APExam> ,这就是它抛出IndexOutOfBoundsException的原因。

你不应该通过任何东西,只需使用APStudentmyExams列表。

public double computeExamAverage() {
    double sum = 0;
    for (APExam myExam : myExams) {
        sum += myExam.getScore();
    }
    return sum / myExams.size();
}

public int findHighestExamScore() {
    int max = 0;
    for(APExam exam : myExams) {
        if(exam.getScore() > max) max = exam.getScore();
    }
    return max;
}

public int numberOfFives() {
    return (int) myExams.stream().filter(apExam -> apExam.getScore() == 5).count();
}

编辑:我也想评论你的主要方法。 您应该使用参数化构造函数而不是默认的构造函数和设置器。 在要求评分之前,您应该检查输入是否为"end"

public static void main(String[] args) {
    final String QUIT = "end"; // not really necessary, but ok
    Scanner sc = new Scanner(System.in);
    String firstName, lastName, subject;
    int score;

    //prompt for info
    System.out.print("Enter first name: ");
    firstName = sc.nextLine();
    System.out.print("\nEnter last name: ");
    lastName = sc.nextLine();
    APStudent student = new APStudent(firstName, lastName); // use of parametrized constructor
    while(true) {
        System.out.print("\nEnter exam subject or 'end' to quit: ");
        subject = sc.nextLine();
        if (subject.equals(QUIT)) break; // check if user wants to end it
        System.out.print("\nEnter exam score: ");
        score = sc.nextInt();
        student.addExam(new APExam(subject, score));  // use of parametrized constructor
        sc.nextLine();
    }
    sc.close(); // never forget to close Scanner

    //display information etc.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM