我的代码中有一个奇怪的错误:
线程中的异常" 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;
}
}
答案 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());
}