Добавление объекта ArrayList в существующий список объектов другого типа

#java #arraylist

#java #arraylist

Вопрос:

Надеюсь, мой заголовок имеет смысл. То, что я пытаюсь сделать со своим кодом, — это читать файл построчно, в котором есть атрибуты о студентах (идентификатор студента, имя, фамилия и т.д.) и курсы, которые они прошли. Я почти уверен, что мой буферизованный reader работает нормально, но я немного теряюсь, когда дело доходит до спецификаций моей программы. Проблема возникает, когда я добавляю объекты списка массивов CourseList к объектам ArrayList для студентов. Код работает нормально, но не добавляет списки курсов к объектам student. По сути, я создаю 2 списка учащихся, в которых должны храниться относящиеся к ним курсы. ie) Student1, Course1, Course2 и т.д..

Заранее благодарю вас, вот мой код:

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

public class studentDir {
    static int currentStudent = 0;
    public static void main(String args[]) throws IOException{
        ArrayList<Student> students = new ArrayList<Student>();

        Scanner input = new Scanner(new File("WarmUpData.txt"));

        while(input.hasNextLine()) {

            String line = input.nextLine();
            StringTokenizer st = new StringTokenizer(line,",");

                while(st.hasMoreTokens()){
                    String first, last, idNo;
                    last = st.nextToken();
                    first = st.nextToken();
                    System.out.println("Added student: " last ", " first);
                    idNo = st.nextToken();
                    System.out.println("Stored ID: " idNo);
                    Student s = new Student(last, first, idNo);
                    students.add(s);
                    line = input.nextLine();
                    st = new StringTokenizer(line,",");
                    while(st.hasMoreTokens()){
                        String x = st.nextToken();
                        System.out.println("If controller read in: " x);
                        if(x.equals("-999")){
                            line = input.nextLine();
                            st = new StringTokenizer(line, ",");
                            System.out.println("Added Credits amp; GPA");
                            Float totalCredits = Float.parseFloat(st.nextToken());
                            Float gpa = Float.parseFloat(st.nextToken());
                            students.get(currentStudent).storeGPA(totalCredits, gpa);
                            System.out.println("GPA Read In : " students.get(currentStudent).getGPA());
                            currentStudent  ;
                        }
                        else{
                            System.out.println("Adding course.");
                            String courseID = x;
                            float credits = Float.parseFloat(st.nextToken());
                            String grade = st.nextToken();
                            System.out.println(x ", " grade);
                            CourseList cl = new CourseList(courseID,grade,credits);
                            s.add(cl);
                            System.out.println(cl.toString());
                            System.out.println(courseID " " credits " " grade " added.");
                            line = input.nextLine();
                            st = new StringTokenizer(line,",");
                            }
                        }

                    for(Student x : students)
                        System.out.println(x.toString());                       
                }

        }
        input.close();      
        currentStudent = 0;
    }
}

import java.util.ArrayList;

public class Student {
    private String firstName;
    private String lastName;
    private String studentID;
    private float gpa;
    private float totalCredits;
    private ArrayList<CourseList> courses = new ArrayList<>();

    Student(String y, String x, String z){
            this.firstName = x;
            this.lastName = y;
            this.studentID = z;
    }

        public String toString(){
            String x = (this.firstName " " this.lastName " " this.studentID ".");
            return x;
        }
        public void setGPA(float x){
            this.gpa = x;
        }

        public float getGPA(){
            return gpa;
        }

        public String getID(){
            return this.studentID;
        }

        public void gpaCalc(Student stu, String id){
            totalCredits = 0;

        }

        public void storeGPA(float tcredits, float gpa){
            this.gpa = gpa;
            this.totalCredits = tcredits;
        }
        public void add(CourseList cl) {

        }

}

public class CourseList {
    String idNo, grade, courseID;
    float credits;
    float gpa;

    public CourseList(String x, String y, float z) {
        this.courseID = x;
        this.grade = y;
        this.credits = z;
    }

    public String toString(){
        String x = ("Course ID: " this.courseID ", Grade : " this.grade ", Credits Earned : " this.credits ".");
        return x;
    }

    public float getCredits() {
        return this.credits;
    }
}


Input: 
Jones,Mary,903452
4342,2.5,A
3311,4,B 
-999
6.5,3.569
Martin,Joseph,312345
4598,3,C
1122,3,A-
2467,4,A
-999
10,3.31

Output: 
Added student: Jones, Mary
Stored ID: 903452
If controller read in: 4342
Adding course.
4342, A
Course ID: 4342, Grade : A, Credits Earned : 2.5.
4342 2.5 A added.
If controller read in: 3311
Adding course.
3311, B 
Course ID: 3311, Grade : B , Credits Earned : 4.0.
3311 4.0 B  added.
If controller read in: -999
Added Credits amp; GPA
GPA Read In : 3.569
Mary Jones 903452.
Added student: Martin, Joseph
Stored ID: 312345
If controller read in: 4598
Adding course.
4598, C
Course ID: 4598, Grade : C, Credits Earned : 3.0.
4598 3.0 C added.
If controller read in: 1122
Adding course.
1122, A-
Course ID: 1122, Grade : A-, Credits Earned : 3.0.
1122 3.0 A- added.
If controller read in: 2467
Adding course.
2467, A
Course ID: 2467, Grade : A, Credits Earned : 4.0.
2467 4.0 A added.
If controller read in: -999
Added Credits amp; GPA
GPA Read In : 3.31
Mary Jones 903452.
Joseph Martin 312345.
  

Заранее спасибо, ребята!

Комментарии:

1. Метод Student#add ничего не делает

2. Рассматривали ли вы возможность использования HashMap?

3. Я не просматривал весь код ur , но while(st.hasMoreTokens()) если этот цикл повторяется дважды в вашем первом ученике, вы в конечном итоге получите students.get(1) пока у вас только один ученик, возможно, это не связано с проблемой, но переосмыслите способ отслеживанияваш текущий ученик

Ответ №1:

ИМХО, использование ArrayList двух разных типов здесь не очень хорошая идея. Вы должны использовать что-то вроде Map<Student, ArrayList<Course>> . Это:

  1. Удобочитаемый и, следовательно, поддерживаемый.
  2. Его тип безопасен.
  3. Позволяет выполнять такие операции, как поиск всех курсов, пройденных любым студентом, для завершения в O(1).

Комментарии:

1. К сожалению, спецификации программы требуют либо связанного списка, либо списка массивов, я думаю, что в будущем мой инструктор попросит use использовать более надежные типы данных и методы поиска.

Ответ №2:

В вашем обрезанном коде ваш метод addCourse пуст

         public void add(CourseList cl) {

    }
  

Я думаю, это ваша проблема здесь

Комментарии:

1. Есть идеи о том, как запрограммировать этот метод? Я не полностью разбираюсь в ArrayLists.

2. @xfbim tutorialspoint.com/java/util/arraylist_add_index.htm Это может быть полезно для понимания того, как добавлять элементы в ArrayList

Ответ №3:

Просто установите для ArrayList of CourseList значение Student Class, тогда он будет работать

 public class studentDir {
                static int currentStudent = 0;
                public static void main(String args[]) throws IOException{
                    ArrayList<Student> students = new ArrayList<Student>();
    ArrayList<CourseList> courseLists=new ArrayList<>();
                    Scanner input = new Scanner(new File("WarmUpData.txt"));

                    while(input.hasNextLine()) {

                        String line = input.nextLine();
                        StringTokenizer st = new StringTokenizer(line,",");

                            while(st.hasMoreTokens()){
                                String first, last, idNo;
                                last = st.nextToken();
                                first = st.nextToken();
                                System.out.println("Added student: " last ", " first);
                                idNo = st.nextToken();
                                System.out.println("Stored ID: " idNo);
                                Student s = new Student(last, first, idNo);

                                line = input.nextLine();
                                st = new StringTokenizer(line,",");
                                while(st.hasMoreTokens()){
                                    String x = st.nextToken();
                                    System.out.println("If controller read in: " x);
                                    if(x.equals("-999")){
                                        line = input.nextLine();
                                        st = new StringTokenizer(line, ",");
                                        System.out.println("Added Credits amp; GPA");
                                        Float totalCredits = Float.parseFloat(st.nextToken());
                                        Float gpa = Float.parseFloat(st.nextToken());
                                        students.get(currentStudent).storeGPA(totalCredits, gpa);
                                        System.out.println("GPA Read In : " students.get(currentStudent).getGPA());
                                        currentStudent  ;
                                    }
                                    else{
                                        System.out.println("Adding course.");
                                        String courseID = x;

                                        float credits = Float.parseFloat(st.nextToken());
                                        String grade = st.nextToken();
                                        System.out.println(x ", " grade);
                                        CourseList cl = new CourseList(courseID,grade,credits);
                                       courseLists.add(cl);
                                        s.setCourses(courseLists);
                                        System.out.println(cl.toString());
                                        System.out.println(courseID " " credits " " grade " added.");
                                        line = input.nextLine();
                                        st = new StringTokenizer(line,",");

                                    }
                                    students.add(s);

                                    }

                                for(Student x : students)
                                    System.out.println(x);                       
                            }

                    }
                    input.close();      
                    currentStudent = 0;
                }
            }



     class Student {
        private String firstName;
        private String lastName;
        private String studentID;
        private float gpa;
        private float totalCredits;
        private ArrayList<CourseList> courses = new ArrayList<>();

        Student(String y, String x, String z) {
            this.firstName = x;
            this.lastName = y;
            this.studentID = z;
        }

        public String toString() {
            String x = (this.firstName   " "   this.lastName   " "   this.studentID   ".");
            return x;
        }

        public void setGPA(float x) {
            this.gpa = x;
        }

        public float getGPA() {
            return gpa;
        }

        public String getID() {
            return this.studentID;
        }

        public void gpaCalc(Student stu, String id) {
            totalCredits = 0;

        }

        public void storeGPA(float tcredits, float gpa) {
            this.gpa = gpa;
            this.totalCredits = tcredits;
        }



        public ArrayList<CourseList> getCourses() {
            return courses;
        }

        public void setCourses(ArrayList<CourseList> courses) {
            this.courses = courses;
        }

    }

    class CourseList {
        String idNo, grade, courseID;
        float credits;
        float gpa;

        public CourseList(String x, String y, float z) {
            this.courseID = x;
            this.grade = y;
            this.credits = z;
        }

        public String toString() {
            String x = ("Course ID: "   this.courseID   ", Grade : "   this.grade   ", Credits Earned : "   this.credits
                      ".");
            return x;
        }

        public float getCredits() {
            return this.credits;
        }
    }