Как изменить мой тип данных из массива в список массивов - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть программа дневника, в которой используются 2-мерные массивы для чтения в инфиле с 2-мя оценками экзамена, а затем имя ученика. *

Для задания мне было поручено вместо использования массивов использовать список массивов. Я изменил учеников и оценки в 2 списка, но я столкнулся с кучей ошибок, которые я не мог понять. Это моя попытка использовать список массивов до сих пор

import java.io.*;
import java.util.*;
import java.util.List;
import java.util.ArrayList;


public class gradebookarraylist {

    public static int numberOfStudents;
    public static int numberOfExams;

    public static void main(String[] args) throws IOException {
        ArrayList<String> Students = new ArrayList<String>(); // the program allows for up to 25 students -> change to array list type str hold students names
        ArrayList<Integer> Grades = new ArrayList<Integer>(); // and 10 exam grades per student-> change to array list hold student grades type int

        BufferedReader inFile;
        inFile = new BufferedReader(new FileReader("Gradebook.txt"));

        int option;
        boolean done = false;
        numberOfStudents = Integer.parseInt(inFile.readLine());
        numberOfExams = Integer.parseInt(inFile.readLine());
        loadArrays(Students, Grades, inFile, numberOfStudents, numberOfExams);

        do {
            option = pickOption();
            done = selectFunction(Students, Grades, option);
        }
        while (!done);
        cleanUp(Students, Grades, numberOfStudents, numberOfExams);
    }

    public static void loadArrays(ArrayList<String> students, ArrayList<Integer> grades, BufferedReader inFile, int numberOfStudents,
                                  int numberOfExams) throws IOException {
        for (int row = 0; row < numberOfStudents; row++) {
            String Students = inFile.readLine();
            for (int col = 0; col < numberOfExams; col++) {
                int Grades = Integer.parseInt(inFile.readLine());
            }
        }
    }

    public static void printWholeBook(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents, int numberOfExams) {
        System.out.println("Here are the grades for all students.\n");
        System.out.print("Name");
        for (int cnt = 1; cnt <= numberOfExams; cnt++)
            System.out.print("  Exam" + cnt);
        System.out.println();
        for (int i = 0; i < numberOfStudents; i++) {
            System.out.print(students.get(i) + "   ");

            for (int j = 0; j < numberOfExams; j++) {
                System.out.print(grades.get(j) + "     ");
            }
            System.out.println();
        }
    }

    public static int pickOption() throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        int choice;

        System.out.println("\nWhat would you like to do?");
        System.out.println("1) Compute the average for all students?");
        System.out.println("2) Compute the average for all exams?");
        System.out.println("3) Add a new student?");
        System.out.println("4) Add a new exam?");
        System.out.println("5) Print the whole grade book?");
        System.out.println("6) Compute the average for one student and their letter grade?");
        System.out.println("7) Compute the average for one exam and its letter grade?");
        System.out.println("9) Exit the program?\n");
        choice = Integer.parseInt(in.readLine());
        return choice;
    }

    public static boolean selectFunction(ArrayList<String> students, ArrayList<Integer> grades, int option) throws IOException {
        boolean done = false;
        switch (option) {
            case 1: {
                allStudentAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }

            case 2: {
                allExamAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 3: {
                numberOfStudents++;
                addStudent(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 4: {
                numberOfExams++;
                addExam(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 5: {
                printWholeBook(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 6: {
                oneStudentAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 7: {
                oneExamAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 9: {
                done = true;
                break;
            }
            default:
                System.out.println("Invalid input.");
        } // end switch
        return done;
    } // end select function


    public static void allStudentAverage(ArrayList<String> students, ArrayList<Integer> grades,
                                         int numberOfStudents, int numberOfExams) {
        double total = 0;
        System.out.println("Here are the averages for all students.\n");
        for (int cnt1 = 0; cnt1 < numberOfStudents; cnt1++) {
            System.out.print("The average for " + students[cnt1] + " is ");
            for (int cnt2 = 0; cnt2 < numberOfExams; cnt2++) {
                total = total + grades[cnt1][cnt2];
            }
            System.out.println(total / numberOfExams);
            total = 0;
        }
    }

    public static void allExamAverage(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                                      int numberOfExams) {
        double total = 0;
        System.out.println("Here are the averages for all exams.\n");
        for (int cnt1 = 0; cnt1 < numberOfExams; cnt1++) {
            System.out.print("The average for Exam #" + (cnt1 + 1) + " is ");
            for (int cnt2 = 0; cnt2 < numberOfStudents; cnt2++) {
                total = total + grades[cnt2][cnt1];
            }
            System.out.println(total / numberOfStudents);
            total = 0;
        }
    }

    public static void addStudent(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                                  int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter the name of the student to be added.");
        students.add(in.readLine());
        System.out.println("Enter the grades for the new student.");
        for (int cnt = 0; cnt <= numberOfExams - 1; cnt++) {
            System.out.println("Enter grade for exam " + (cnt + 1));
            grades.add(Integer.parseInt(in.readLine()));
        }
    }

    public static void addExam(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                               int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter grades for the new exam.");
        for (int cnt = 0; cnt <= numberOfStudents - 1; cnt++) {
            System.out.println("Enter the new grade for " + students[cnt]);
            grades.add(Integer.parseInt(in.readLine()));
        }
    }

    public static void oneStudentAverage(ArrayList<String> students, ArrayList<Integer> grades,
                                         int numberOfStudents, int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        double total = 0;
        int studentNumber;
        System.out.println("Please enter the number of the student whose average would you like to see?\n");
        for (int cnt = 0; cnt < numberOfStudents; cnt++) {
            System.out.println((cnt + 1) + ") " + students[cnt]);
        }
        studentNumber = Integer.parseInt(in.readLine());
        System.out.print("\nThe average for " + students[studentNumber - 1] + " is ");
        for (int cnt2 = 0; cnt2 < numberOfExams; cnt2++) {
            total = total + grades[studentNumber - 1][cnt2];
        }
        double average = total / numberOfExams;
        System.out.println(average);

        if (average >= 90) {
            System.out.println(students[studentNumber - 1] + " has an A.");
        } else if (average >= 80 && average <= 89) {
            System.out.println(students[studentNumber - 1] + " has a B.");
        } else if (average >= 70 && average <= 79) {
            System.out.println(students[studentNumber - 1] + " has a C.");
        } else if (average >= 60 && average <= 69) {
            System.out.println(students[studentNumber - 1] + " has a D.");
        } else if (average <= 59) {
            System.out.println(students[studentNumber - 1] + " has an F.");
        }
    }

    public static void oneExamAverage(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                                      int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        double total = 0;
        int examNumber;
        System.out.println("There are " + numberOfExams + " exams.");
        System.out.println("Please enter the number of the exam whose average would you like to see?\n");
        examNumber = Integer.parseInt(in.readLine());
        System.out.print("The average for Exam #" + (examNumber) + " is ");
        for (int cnt2 = 0; cnt2 < numberOfStudents; cnt2++) {
            total = total + grades[cnt2][examNumber - 1];
        }
        double average = total / numberOfStudents;
        System.out.println(average);

        if (average >= 90) {
            System.out.println("The average for Exam #" + examNumber + " is an A.");
        } else if (average >= 80 && average <= 89) {
            System.out.println("The average for Exam #" + examNumber + " is a B.");
        } else if (average >= 70 && average <= 79) {
            System.out.println("The average for Exam #" + examNumber + " is a C.");
        } else if (average >= 60 && average <= 69) {
            System.out.println("The average for Exam #" + examNumber + " is a D.");
        } else if (average <= 59) {
            System.out.println("The average for Exam # " + examNumber + " is an F.");
        }
    }

    public static void cleanUp(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                               int numberOfExams) throws IOException {
// set up output file
        PrintWriter outFile;
        outFile = new PrintWriter(new FileWriter("Gradebook.txt"));
        outFile.println(numberOfStudents);
        outFile.println(numberOfExams);
        // write array to output file
        for (int row = 0; row < numberOfStudents; row++) {
            outFile.println(students.get(row));
            for (int col = 0; col < numberOfExams; col++) {
                outFile.println(grades.get(col));
            }
        }
        outFile.close();
        System.out.println("The Grade Book file is saved so you can");
        System.out.println("pick up next time where you left off.\n");
    }
}

Любая помощь приветствуется.

Ответы [ 4 ]

0 голосов
/ 25 февраля 2020

Я приведу следующий пример

String [] names = {"John","Bill","Sam"};
List arrylist =Arrays.asList(names);

, который преобразует ваш массив в список массивов, если это был ответ, который вы искали.

0 голосов
/ 25 февраля 2020

Вы получаете ошибки, потому что синтаксис ArrayList отличается. Я предлагаю вам закомментировать весь старый код, который не компилируется, и начать исправлять его методом по методам. Используйте подход «немного измени, немного протестируй».

Вот начало:

Я переименовал ваши Students и Grades переменные в loadArrays(), поскольку они являются единичными элементами , а не во множественном числе. Java соглашение предлагает использовать строчные имена для переменных. Кроме того, используйте верхний регистр верблюда для имен классов: GradeBookArrayList.

public static void loadArrays(ArrayList<String> students, ArrayList<Integer> grades, BufferedReader inFile, int numberOfStudents,
                              int numberOfExams) throws IOException {
    for (int row = 0; row < numberOfStudents; row++) {
        String student = inFile.readLine();
        students.add(student); // How to add to students array
        for (int col = 0; col < numberOfExams; col++) {
            int grade = Integer.parseInt(inFile.readLine());
            grades.add(grade); // How to add to grades array
        }
    }
}

Синтаксис для ArrayList не использует квадратные скобки для индексации, как это делают примитивные массивы. Пожалуйста, обратитесь к онлайн-документации или примерам синтаксиса ArrayList.

Вот ваш закомментированный, компилируемый и с отступом код:

import java.io.*;
import java.util.ArrayList;


public class gradebookarraylist { // Use upper camel case for your class names: GradeBookArrayList

    public static int numberOfStudents;
    public static int numberOfExams;

    public static void main(String[] args) throws IOException {
        ArrayList<String> Students = new ArrayList<String>(); // the program allows for up to 25 students -> change to array list type str hold students names
        ArrayList<Integer> Grades = new ArrayList<Integer>(); // and 10 exam grades per student-> change to array list hold student grades type int

        BufferedReader inFile;
        inFile = new BufferedReader(new FileReader("Gradebook.txt"));

        int option;
        boolean done = false;
        numberOfStudents = Integer.parseInt(inFile.readLine());
        numberOfExams = Integer.parseInt(inFile.readLine());
        loadArrays(Students, Grades, inFile, numberOfStudents, numberOfExams);

        do {
            option = pickOption();
            done = selectFunction(Students, Grades, option);
        }
        while (!done);
        cleanUp(Students, Grades, numberOfStudents, numberOfExams);
    }

    public static void loadArrays(ArrayList<String> students, ArrayList<Integer> grades, BufferedReader inFile, int numberOfStudents,
                                  int numberOfExams) throws IOException {
        for (int row = 0; row < numberOfStudents; row++) {
            String student = inFile.readLine();
            students.add(student);
            for (int col = 0; col < numberOfExams; col++) {
                int grade = Integer.parseInt(inFile.readLine());
                grades.add(grade);
            }
        }
    }

    public static void printWholeBook(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents, int numberOfExams) {
        System.out.println("Here are the grades for all students.\n");
        System.out.print("Name");
        for (int cnt = 1; cnt <= numberOfExams; cnt++)
            System.out.print("  Exam" + cnt);
        System.out.println();
        for (int i = 0; i < numberOfStudents; i++) {
            System.out.print(students.get(i) + "   ");

            for (int j = 0; j < numberOfExams; j++) {
                System.out.print(grades.get(j) + "     ");
            }
            System.out.println();
        }
    }

    public static int pickOption() throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        int choice;

        System.out.println("\nWhat would you like to do?");
        System.out.println("1) Compute the average for all students?");
        System.out.println("2) Compute the average for all exams?");
        System.out.println("3) Add a new student?");
        System.out.println("4) Add a new exam?");
        System.out.println("5) Print the whole grade book?");
        System.out.println("6) Compute the average for one student and their letter grade?");
        System.out.println("7) Compute the average for one exam and its letter grade?");
        System.out.println("9) Exit the program?\n");
        choice = Integer.parseInt(in.readLine());
        return choice;
    }

    public static boolean selectFunction(ArrayList<String> students, ArrayList<Integer> grades, int option) throws IOException {
        boolean done = false;
        switch (option) {
            case 1: {
                allStudentAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }

            case 2: {
                allExamAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 3: {
                numberOfStudents++;
                addStudent(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 4: {
                numberOfExams++;
                addExam(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 5: {
                printWholeBook(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 6: {
                oneStudentAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 7: {
                oneExamAverage(students, grades, numberOfStudents, numberOfExams);
                break;
            }
            case 9: {
                done = true;
                break;
            }
            default:
                System.out.println("Invalid input.");
        } // end switch
        return done;
    } // end select function


    public static void allStudentAverage(ArrayList<String> students, ArrayList<Integer> grades,
                                         int numberOfStudents, int numberOfExams) {
        double total = 0;
        System.out.println("Here are the averages for all students.\n");
//        for (int cnt1 = 0; cnt1 < numberOfStudents; cnt1++) {
//            System.out.print("The average for " + students[cnt1] + " is ");
//            for (int cnt2 = 0; cnt2 < numberOfExams; cnt2++) {
//                total = total + grades[cnt1][cnt2];
//            }
//            System.out.println(total / numberOfExams);
//            total = 0;
//        }
    }

    public static void allExamAverage(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                                      int numberOfExams) {
        double total = 0;
        System.out.println("Here are the averages for all exams.\n");
//        for (int cnt1 = 0; cnt1 < numberOfExams; cnt1++) {
//            System.out.print("The average for Exam #" + (cnt1 + 1) + " is ");
//            for (int cnt2 = 0; cnt2 < numberOfStudents; cnt2++) {
//                total = total + grades[cnt2][cnt1];
//            }
//            System.out.println(total / numberOfStudents);
//            total = 0;
//        }
    }

    public static void addStudent(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                                  int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter the name of the student to be added.");
        students.add(in.readLine());
        System.out.println("Enter the grades for the new student.");
        for (int cnt = 0; cnt <= numberOfExams - 1; cnt++) {
            System.out.println("Enter grade for exam " + (cnt + 1));
            grades.add(Integer.parseInt(in.readLine()));
        }
    }

    public static void addExam(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                               int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter grades for the new exam.");
//        for (int cnt = 0; cnt <= numberOfStudents - 1; cnt++) {
//            System.out.println("Enter the new grade for " + students[cnt]);
//            grades.add(Integer.parseInt(in.readLine()));
//        }
    }

    public static void oneStudentAverage(ArrayList<String> students, ArrayList<Integer> grades,
                                         int numberOfStudents, int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        double total = 0;
        int studentNumber;
        System.out.println("Please enter the number of the student whose average would you like to see?\n");
//        for (int cnt = 0; cnt < numberOfStudents; cnt++) {
//            System.out.println((cnt + 1) + ") " + students[cnt]);
//        }
        studentNumber = Integer.parseInt(in.readLine());
//        System.out.print("\nThe average for " + students[studentNumber - 1] + " is ");
//        for (int cnt2 = 0; cnt2 < numberOfExams; cnt2++) {
//            total = total + grades[studentNumber - 1][cnt2];
//        }
        double average = total / numberOfExams;
        System.out.println(average);

//        if (average >= 90) {
//            System.out.println(students[studentNumber - 1] + " has an A.");
//        } else if (average >= 80 && average <= 89) {
//            System.out.println(students[studentNumber - 1] + " has a B.");
//        } else if (average >= 70 && average <= 79) {
//            System.out.println(students[studentNumber - 1] + " has a C.");
//        } else if (average >= 60 && average <= 69) {
//            System.out.println(students[studentNumber - 1] + " has a D.");
//        } else if (average <= 59) {
//            System.out.println(students[studentNumber - 1] + " has an F.");
//        }
    }

    public static void oneExamAverage(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                                      int numberOfExams) throws IOException {
        BufferedReader in;
        in = new BufferedReader(new InputStreamReader(System.in));
        double total = 0;
        int examNumber;
        System.out.println("There are " + numberOfExams + " exams.");
        System.out.println("Please enter the number of the exam whose average would you like to see?\n");
        examNumber = Integer.parseInt(in.readLine());
        System.out.print("The average for Exam #" + (examNumber) + " is ");
//        for (int cnt2 = 0; cnt2 < numberOfStudents; cnt2++) {
//            total = total + grades[cnt2][examNumber - 1];
//        }
        double average = total / numberOfStudents;
        System.out.println(average);

        if (average >= 90) {
            System.out.println("The average for Exam #" + examNumber + " is an A.");
        } else if (average >= 80 && average <= 89) {
            System.out.println("The average for Exam #" + examNumber + " is a B.");
        } else if (average >= 70 && average <= 79) {
            System.out.println("The average for Exam #" + examNumber + " is a C.");
        } else if (average >= 60 && average <= 69) {
            System.out.println("The average for Exam #" + examNumber + " is a D.");
        } else if (average <= 59) {
            System.out.println("The average for Exam # " + examNumber + " is an F.");
        }
    }

    public static void cleanUp(ArrayList<String> students, ArrayList<Integer> grades, int numberOfStudents,
                               int numberOfExams) throws IOException {
// set up output file
        PrintWriter outFile;
        outFile = new PrintWriter(new FileWriter("Gradebook.txt"));
        outFile.println(numberOfStudents);
        outFile.println(numberOfExams);
        // write array to output file
        for (int row = 0; row < numberOfStudents; row++) {
            outFile.println(students.get(row));
            for (int col = 0; col < numberOfExams; col++) {
                outFile.println(grades.get(col));
            }
        }
        outFile.close();
        System.out.println("The Grade Book file is saved so you can");
        System.out.println("pick up next time where you left off.\n");
    }
}
0 голосов
/ 25 февраля 2020

Я изменил один метод, чтобы показать, как использовать ArrayList. Поскольку оценки являются двухмерными, вы должны определить его как ArrayList из ArrayList и получить доступ к его содержимому как grades.get (cnt1) .get (cnt2). Чтобы добавить оценку, вы можете использовать метод add grades.get (cnt1) .add (cnt2).

 public static void allStudentAverage(ArrayList<String> students, 
             ArrayList<ArrayList<Integer>> grades,
            int numberOfStudents,int numberOfExams)
    {
        double total = 0;
        System.out.println("Here are the averages for all students.\n");
        for (int cnt1 = 0; cnt1<numberOfStudents; cnt1++)
        {
            System.out.print("The average for " + students.get(cnt1) + " is ");
            for (int cnt2 = 0; cnt2<numberOfExams; cnt2++)
            {
                total = total + grades.get(cnt1).get(cnt2);
            }
            System.out.println(total/numberOfExams);
            total = 0;
        }
    }
0 голосов
/ 25 февраля 2020

Я приведу следующий пример

String [] names = {"John","Bill","Sam"};
List arrylist =Arrays.asList(names);

, который преобразует ваш массив в список массивов, если это был ответ, который вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...