错误:java.util.AbstractList $ Itr无法强制转换为ex2.Tuple

时间:2016-03-03 15:34:04

标签: java arraylist

我的代码中有一个奇怪的错误:

  

线程中的异常" main" java.lang.ClassCastException:java.util.AbstractList $ Itr

     

无法投射到ex2.Tuple       在ex2.Main.main(Main.java:142)

因为在GradeBook课程中我有这个声明

  

private ArrayList courseLists;

我不明白这个演员的例外

这是我的完整代码:

问题出在Main.java第142行:

Tuple tupleObject = (Tuple)iterator;

GradeBook.java:

package ex2;


import java.util.ArrayList;


public class GradeBook {
    private ArrayList<Tuple> courseLists;

    //final mark for the student
    private float finalStudentmark;

    public GradeBook(){
        courseLists = new ArrayList<Tuple>();
        finalStudentmark = 0;
    }

    public ArrayList<Tuple> getCourseLists() {
        return courseLists;
    }

    public void setCourseLists(Tuple t) {
        this.courseLists.add(t);
    }

    public float getFinalStudentmark() {
        return finalStudentmark;
    }

    public void setFinalStudentmark(float finalStudentmark) {
        this.finalStudentmark = finalStudentmark;
    }
}

Main.java:

package ex2;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ScheduledThreadPoolExecutor;

import static java.util.concurrent.TimeUnit.*;

public class Main {

    public static void main(String[] args) {

        //1- create 10 courses
           Course[] courseLists = new Course[10];

           for(int i=0; i<10; i++){
              //create 
              Course course = new Course("course"+i, "courseId"+i, "", 60.0f, 0, 0.0f);
              courseLists[i]=course;
           }

         //2- create 7 professors
            Professor[] professorLists = new Professor[7];     

            Random rand= new Random();

            int min=1;

            int max = 6;

            for(int i=0; i<7; i++){
                  //create 
                  Professor professor = new Professor("ProfessorFirstName"+i, "ProfessorLastName"+i, 35, "MALE", "adress"+i, "professorId"+i);

                  courseLists[i].setAssignedProfessor("profId"+i);

                  professor.setCourseList(courseLists[i]);

                  professorLists[i] = professor;                          
           }

           rand= new Random();
           int randomNum1 = rand.nextInt((max - min) + 1) + min;
           int randomNum2 = rand.nextInt((max - min) + 1) + min;

           while ( randomNum2 == randomNum1 ) {
               randomNum2 = rand.nextInt((max - min) + 1) + min;
           }

           courseLists[8].setAssignedProfessor("profId"+randomNum1);
           professorLists[randomNum1].setCourseList(courseLists[8]);

           courseLists[9].setAssignedProfessor("profId"+randomNum2);
           professorLists[randomNum2].setCourseList(courseLists[9]);

           courseLists[7].setAssignedProfessor("profId"+1);
           professorLists[1].setCourseList(courseLists[7]);

          //3- create 30 students
           Student[] studentsLists = new Student[30];

           //--------------------
            boolean genderValue;

            //generate number of courses per student
            //randomNbrCourses: number of courses taken by the current student
            for(int i=0; i<30; i++){
                int minNbrCourses = 1;              
                int maxNbrCourses = 6;              
                int randomNbrCourses;
                rand= new Random();
                randomNbrCourses = rand.nextInt((maxNbrCourses - minNbrCourses) + 1) + minNbrCourses;

                //generate random age
                int minStudentAge=18;           
                int maxStudentAge = 48;         
                int randomAge = -1;
                rand= new Random();
                randomAge = rand.nextInt((maxStudentAge - minStudentAge) + 1) + minStudentAge;

                //gender
                genderValue = Math.random() < 0.5;            
                String gender;            
                if (genderValue == false)
                    gender = "FEMALE";
                else
                    gender = "MALE";

                HashSet<Integer> tempSet;
                tempSet = new HashSet<Integer>();
                GradeBook gradeBook = new GradeBook();

                for ( int nbrCourse=0; nbrCourse<randomNbrCourses; nbrCourse++) {                 

                      Tuple tupleValue = new Tuple();

                      //generate one number , this number correspand to a course id...
                      int randomNumber = rand.nextInt(10);  
                      tempSet.add(randomNumber);

                      while (tempSet.contains(randomNumber))
                          randomNumber = rand.nextInt(10);

                      tempSet.add(randomNumber);

                      courseLists[randomNumber].setNbrEnrolledStudent(1);

                      Random newRand= new Random();

                      //generate four random marks for the course....
                      float randomMark1 = newRand.nextFloat()*(100.0f-0.0f) + 0.0f;                     
                      tupleValue.setMarkExam1(randomMark1);

                      float randomMark2 = newRand.nextFloat()*(100.0f-0.0f) + 0.0f;
                      tupleValue.setMarkExam2(randomMark2);

                      float randomMark3 = newRand.nextFloat()*(100.0f-0.0f) + 0.0f;
                      tupleValue.setMarkExam3(randomMark3);

                      float randomMark4 = newRand.nextFloat()*(100.0f-0.0f) + 0.0f;
                      tupleValue.setMarkExam4(randomMark4);

                      tupleValue.setFinalMark((randomMark1+randomMark2+randomMark3+randomMark4)/4);

                      tupleValue.setCourseName("course"+randomNumber);

                      tupleValue.setCourseId("courseId"+randomNumber);                       

                      gradeBook.setCourseLists(tupleValue);                   
                   }

                Student student = new Student("firstName_student"+i,  "lastName_student"+i, randomAge, gender, "adress"+i, "idStudent"+i, null ,gradeBook);

                //for quick access, add courses ids
                Iterator<Tuple> iterator = (Iterator<Tuple>) gradeBook.getCourseLists().iterator();
                while (iterator.hasNext()) {
                    Tuple tupleObject = (Tuple)iterator;                
                    student.getCourseLists().add(tupleObject.getCourseId());
                }

                studentsLists[i]=student;

                studentsLists[i].setNbrCourses(randomNbrCourses);
            }

            //we have to verify that there is no course with less than 3 student enrolled


            //create the admin thread

            //1- create a schedule for the exam
              HashMap<String, float[]> examScheduleMap;
              examScheduleMap = new HashMap <String, float[]>();

              //ExamSchedule eSchedule = new ExamSchedule();

              Thread examSchedTh = new Thread( new ExamSchedule(examScheduleMap, courseLists));
              examSchedTh.start();

              try {
                    examSchedTh.join();
              } catch (InterruptedException e) {
                    e.printStackTrace();
              }

              //using thread pool and scheduler for students

              // 1- thread pool

              ScheduledThreadPoolExecutor eventPool = new ScheduledThreadPoolExecutor(30);

              for (int j=0;j<30;j++)
                  eventPool.schedule(new StudentThread(courseLists, studentsLists, j), 0, SECONDS);

              //for (int i=0; i<30;i++)
                //  thPoolStudent[i] = new Thread( new StudentThread(courseLists));
              //th1.start();

              //wait for the exam period


           //print the list of courses
           getWholeCouces(courseLists, studentsLists);

           //print the professors and there assigned  courses
           getProfessorsAndAssignedCouces(professorLists);

           //print the list of all students and the courses enrolled in
           getStudentsWithEnrolledCourses(studentsLists);

    }
    /*
    static float getMinMarkCourse(){

    }

    static float getMaxMarkCourse(){

    }

    static float getGroupMarkCourse(){

    }*/

    //method to print the list of all students and the courses they are enrolled in
    static void getStudentsWithEnrolledCourses(Student[] student){
        System.out.println(" ");
        System.out.println("----------------------------------------------------------");
        System.out.println("list of all students and the courses they are enrolled in:");
        System.out.println("----------------------------------------------------------");
        for (int i=0; i<30;i++){
           System.out.print(student[i].getLastName());
           System.out.print("  "+student[i].getIdentificationNumber());

           GradeBook gb = student[i].getGradeBook();

           ArrayList<Tuple> tuple = gb.getCourseLists();

           for (int L=0; L< tuple.size(); L++)
           {
               System.out.println(" ");
               System.out.print("   "+tuple.get(L).getCourseId());
               System.out.print("  "+tuple.get(L).getFinalMark());
           }
           System.out.println(" ");
           System.out.println(" ");
        }



    }


    //method to get the professors and there assigned  courses
    static void getProfessorsAndAssignedCouces(Professor[] professor){
        System.out.println(" ");
        System.out.println("---------------------------------------");
        System.out.println("professors and there assigned  courses:");
        System.out.println("---------------------------------------");
        for(int i=0; i<7; i++){
              System.out.println("  ");
              System.out.print(professor[i].getFirstName()); 

              System.out.print("  "+professor[i].getIdentificationNumber());
              System.out.println(" ");

              System.out.println(" ");
              List<Course> courseList = professor[i].getCourseList();

              for (int k=0; k < courseList.size(); k++){
                  System.out.print("    "+courseList.get(k).getCourseId());
                  System.out.print("  "+courseList.get(k).getNbrEnrolledStudent());
                  System.out.print("  "+courseList.get(k).getAverageCourseMark());
                  System.out.println(" ");
              }  
              System.out.println(" ");
         }
    }

    //method to get the list of all courses
    static void getWholeCouces(Course[] courseList,Student[] studentsList){
        System.out.println("----------------");
        System.out.println("list of courses:");
        System.out.println("----------------");
        // maxMark = max mark of the course
        // minMark = minimum mark of the course
        float maxMark = Float.MIN_VALUE;
        float minMark = Float.MAX_VALUE;

        float allMarks = 0.0f;
        float nbOfEnrolledStudent=0.0f;

        for(int i=0; i<10; i++){
              //create 
              String courseName = courseList[i].getCourseName();

              //look for enrolled student
              for(int nbStudent=0; nbStudent<30; nbStudent++){
                  ArrayList<Tuple> temp = studentsList[nbStudent].getGradeBook().getCourseLists();
                  for (int j=0;j< temp.size();j++){
                      if (temp.get(j).getCourseName().equals(courseName)){
                          if (temp.get(j).getFinalMark() > maxMark )
                              maxMark = temp.get(j).getFinalMark();

                          if (temp.get(j).getFinalMark() < minMark )
                              minMark = temp.get(j).getFinalMark();

                          allMarks += temp.get(j).getFinalMark();
                          nbOfEnrolledStudent+=1;
                      }
                  }
              }

              courseList[i].setAverageCourseMark((allMarks)/nbOfEnrolledStudent);

              System.out.print(courseName);
              System.out.print("  "+courseList[i].getCourseId());
              System.out.print("  "+courseList[i].getAssignedProfessor());
              System.out.print("  "+courseList[i].getNbrEnrolledStudent());
              System.out.print("  "+minMark);
              System.out.print("  "+maxMark);
              System.out.print("  "+(allMarks)/nbOfEnrolledStudent);
              System.out.println("  ");
        }
    }
}

Tuple.java:

package ex2;


public class Tuple{ 

     private String courseName;

     private String courseId;

     private float markExam1;

     private float markExam2;

     private float markExam3;

     private float markExam4;

     private float finalMark;

     //default constructor
     public Tuple(){ 
         super();
         courseName = "";

         courseId = "";

         markExam1 = 0;

         markExam2 = 0;

         markExam3 = 0;

         markExam4 = 0;

         finalMark = 0;
     }

     public String getCourseId() {
        return courseId;
    }

    public void setCourseId(String courseId) {
        this.courseId = courseId;
    }

    public Tuple(String courseName, String courseId, float markExam1, float markExam2, float markExam3, float markExam4, float finalMark) { 
         this.courseName = courseName;
         this.courseId   = courseId;
         this.markExam1  = markExam1; 
         this.markExam2  = markExam2;
         this.markExam3  = markExam3;
         this.markExam4  = markExam4;
         this.finalMark  = finalMark;
     } 

     public String getCourseName() {
        return courseName;
     }


     public void setCourseName(String courseName) {
        this.courseName = courseName;
     }


     public float getMarkExam1() {
        return markExam1;
     }


     public void setMarkExam1(float markExam1) {
        this.markExam1 = markExam1;
     }


     public float getMarkExam2() {
        return markExam2;
     }


     public void setMarkExam2(float markExam2) {
        this.markExam2 = markExam2;
     }


     public float getMarkExam3() {
        return markExam3;
     }


     public void setMarkExam3(float markExam3) {
        this.markExam3 = markExam3;
     }


     public float getMarkExam4() {
        return markExam4;
     }


     public void setMarkExam4(float markExam4) {
        this.markExam4 = markExam4;
     }


     public float getFinalMark() {
        return finalMark;
     }


     public void setFinalMark(float finalMark) {
        this.finalMark = finalMark;
     }

} 

2 个答案:

答案 0 :(得分:1)

替换

Tuple tupleObject = (Tuple)iterator;

Tuple tupleObject = iterator.next();

答案 1 :(得分:1)

您无法将迭代器强制转换为元组。在iterator上调用下一个方法:

while (iterator.hasNext()) {
    Tuple tupleObject = iterator.next();                
    student.getCourseLists().add(tupleObject.getCourseId());
}