简体   繁体   中英

How to read lines from a file and assign the lines to an array?

Currently, I'm trying to read in a .dat file and assign various lines into an array. The file will provide items like "a100" and "q80" which I will have to separate into categories by letter and then have different grades as an array for each category. Right now, this is what I have, but I'm getting a lot of run-time errors when I try various things. Is there something I'm missing here?

Some of the errors I'm having:

  1. When I execute case 'P', it prints this out: WeightedGrades@13105f32
  2. When I try to execute cases C, A or D, this happens: Exception in thread "main" java.lang.NoSuchMethodError: WeightedGrades.deleteGrade(Ljava/lang/String;)Z

WeightedGrades class:

public class WeightedGrades {
   private String name;
   private int numGrades;
   private String[] grades;
   public static final double ACTV_WT = 0.05, QUIZ_WT = 0.10, PROJ_WT = 0.25, EXAM_WT = 0.30, FINAL_EXAM_WT = 0.30;

   public WeightedGrades(String nameIn, int numGradesIn, String[] gradesIn) {
      name = nameIn;
      numGrades = numGradesIn;
      grades = gradesIn;
   }

   public String getName() {
      return name;
   }
   public int getNumGrades() {
      return numGrades;
   }
   public String[] getGrades() {
      return grades;
   }
   public double[] gradesByCategory(char categoryChar) {
      int count = 0;
      for (int i = 0; i < grades.length; i++) {
         if (categoryChar == grades[i].charAt(0)) {
            count++;
         }
      }
      double[] gradesNew = new double[count];
      count = 0;
      for( int i = 0; i < numGrades; i++) {
         if (categoryChar == grades[i].charAt(0)) {
            gradesNew[count] = Double.parseDouble(grades[i].substring(1));
            count++;
         }
      }
      return gradesNew;
   }
   public String toString() {
      String result = "\tStudent Name: " + getName()
         + "\n\tActivities: " + gradesByCategory('A')
         + "\n\tQuizzes: " + gradesByCategory('Q')
         + "\n\tProjects: " + gradesByCategory('P')
         + "\n\tExams: " + gradesByCategory('E')
         + "\n\tFinal Exam: " + gradesByCategory('F')
         + "\n\tCourse Average: " + courseAvg();
      return result;
   }
   public void addGrade(String newGrade) {
      if (numGrades >= grades.length) {
         increaseGradesCapacity();
      }
      grades[numGrades] = newGrade;
      numGrades++;
   }
   public boolean deleteGrade(String gradeDelete) {
      boolean delete = false;
      int deleteIndex = -1;
      for (int i = 0; i < numGrades; i++) {
         if (gradeDelete.charAt(0) == grades[i].charAt(0) && 
            Double.parseDouble(gradeDelete.substring(1)) 
            == Double.parseDouble(grades[i].substring(1))) {
            deleteIndex = i;
         }
      }   
      if (deleteIndex > -1) {
         for (int i = deleteIndex; i < numGrades - 1; i++) {
            grades[i] = grades[i + 1];
         }
         grades[numGrades - 1] = "";
         numGrades--;
         return true;
      }
      else {
         return false;
      }
   }
   public void increaseGradesCapacity() {
      String[] temporary = new String[grades.length + 1];
      for (int i = 0; i < grades.length; i++) {
         temporary[i] = grades[i];
      }
      grades = temporary;
   }
   public double average(double[] newArray) {
      if (newArray.length == 0) {
         return 0.0;
      }
      double sum = 0;
      double average = 0;
      for ( int i = 0; i < newArray.length; i++) {
         sum += newArray[i];
         average = sum / newArray.length; 
      }
      return average;
   }
   public double courseAvg() {
      double actvAvg = 0.0;
      double quizAvg = 0.0;
      double projAvg = 0.0;
      double examAvg = 0.0;
      double finalAvg = 0.0;
      double avg = 0.0; 
      if (!numGrades.length == 0) {
         avg = actvAvg * ACTV_WT + quizAvg * QUIZ_WT + projAvg * PROJ_WT + examAvg * EXAM_WT + finalAvg * FINAL_EXAM_WT;
      }   
      return avg;
   }
}

Second class

import java.util.Scanner;
import java.io.IOException;

public class WeightedGradesApp {

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

      String name = "";
      int numGrades = 0;
      String[] grades = new String[13];
      String code =  "";
      String gradeAdd = "";
      String gradeDelete = "";
      String categoryIn = "";

      WeightedGrades student = new WeightedGrades(name, numGrades, grades);
      Scanner userInput = new Scanner(System.in);

      if (args == null) {
         System.out.println("File name was expected as a run argument.");
         System.out.println("Program ending."); 
         return;
      }
      else {
         System.out.println("File read in and WeightedGrades object created.");
         System.out.println("");
         System.out.println("Player App Menu");
         System.out.println("P - Print Report");
         System.out.println("C - Print Category");
         System.out.println("A - Add Grade");
         System.out.println("D - Delete Grade");
         System.out.println("Q - Quit ");
         do {
            System.out.print("Enter Code [P, C, A, D, or Q]: ");
            code = userInput.nextLine();
            if (code.length() == 0) {
               continue;
            }
            code = code.toUpperCase();
            char codeChar = code.charAt(0);
            switch (codeChar) {   
               case 'P':
                  System.out.println(student.toString());
                  break;
               case 'C':
                  System.out.print("      Category: ");
                  categoryIn = userInput.nextLine();
                  char categoryChar = categoryIn.charAt(0);
                  System.out.println(student.gradesByCategory(categoryChar));
                  break;
               case 'A':
                  System.out.print("      Grade to add: ");
                  gradeAdd = userInput.nextLine();
                  student.addGrade(gradeAdd);
                  break;
               case 'D':
                  System.out.print("      Grade to delete: ");
                  gradeDelete = userInput.nextLine();
                  boolean isDeleted = student.deleteGrade(gradeDelete);
                  if (isDeleted) {
                     System.out.println("      Grade deleted");
                  }
                  else {
                     System.out.println("      Grade not found");
                  }   
                  break;
               case 'Q':
                  break;      
               default:
            }
         } while (!code.equalsIgnoreCase("Q"));
      }      
   }
}

For starters your code as is doesn't compile due to the line

if (!numGrades.length == 0) { 

This is because numGrades is an int it is a primative type and therefore does not have any property length . I'm assuming what you want here is

if (numGrades != 0) {

Also as I mentioned you are not dealing with reading in the file, you supply the file name but never actually read it, I suggest you look at the Java tutorial on File IO

On this note you do the check args == null this will not check that no args are supplied, try it. what you want is args.length == 0

On your other error I have no idea how you even produced that... I'm assuming it is using an older compiled version of the class where the methods have not being written.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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