使用一个循环使用Iterator模式java打印出两个数据结构

时间:2012-03-22 06:11:11

标签: java design-patterns iterator while-loop

我有一个程序,其中包含来自两所大学的学生数据,文科学院和某些学校的技术学院。洛杉矶大学在其班级中使用了一个ArrayList,而Tech大学在其班级中使用和阵列来容纳学生。我已经将Iterator模式(使用我自己的迭代器)实现到这个程序中,因此有一个Iterator接口加上一个用于LAStudents类的具体迭代器和一个用于TechStudents类。我已经实现了next()和hasNext()方法。还有一个名为Students的学生类的接口类,它定义了createIterator()方法和read()方法。该程序从文本文件中获取有关学生的数据,如下所示:

    TechStudents.txt:
    Smith William CompSci Tech 90 90 340
    Jones Michael CompEnr Tech 45 45 100
    Carter Mary SoftEng Tech 128 124 270
    Harris Harry CompSci Tech 30 30 90
    Wilson Brian CompSci Tech 90 90 270
    Adams Susan CompEng Tech 12 12 45
    Washington George SoftEng Tech 96 96 360
    Jackson Andrew SoftEng Tech 62 60 145
    Madison James CompSci Tech 78 76 120
    Monroe Alicia CompSci Tech 87 87 256

有一个类似的文件与学生一起参加LAcollege。我需要做的是打印出所有学生,包括数组中的学生和ArrayList中的学生,只需一个循环即可。此外,我需要在输出中按姓氏排序学生。这就是我被困住的地方。我意识到我需要一个Comparator或者一个Comparable类,但我不知道哪个是对的,什么是问题的最佳解决方案。是的,这是家庭作业,但我不是想偷工减料,我只是想要一些帮助,这样我就能更好地理解如何编写解决方案。毕竟,这是一个OO课程。

这是包含学生数据的StudentData类。我添加了compareTo()方法和toString()(除了最初提供的代码之外)。

公共类StudentData {

private String LastName, FirstName;
private String Major;
private String College;
private int CreditHoursAttempted;
private int CreditHoursEarned;
private int QualityPoints;

public StudentData(String ln, String fn, String mj, String col,
        int cha, int che, int qp) {
    LastName = ln;
    FirstName = fn;
    Major = mj;
    College = col;
    CreditHoursAttempted = cha;
    CreditHoursEarned = che;
    QualityPoints = qp;
}

public String GetName() {
    return LastName + ", " + FirstName;
}

public String GetCollege() {
    return College;
}

public String GetMajor() {
    return Major;
}

public int GetCreditHoursAttempted() {
    return CreditHoursAttempted;
}

public int GetCreditHoursEarned() {
    return CreditHoursEarned;
}

public int GetQualityPoints() {
    return QualityPoints;
}

public int GPA() {
    return QualityPoints / CreditHoursAttempted;
}

public int compareTo(StudentData other){
    return this.LastName.compareTo(other.LastName);  
}

@Override
public String toString() {
    String s = GetName() + " " + College + " " +  Major + " " + GPA();
    return s;
}

}

以下是我从学生类中调用read()方法然后遍历两个数据结构并打印输出的类:

公共类ProcessStudents {

Students la = new LAStudents();
Students tech = new TechStudents();
StudentsIterator laItr = la.createIterator();
StudentsIterator techItr = tech.createIterator();

public void readAll() throws IOException {
    la.read();
    tech.read();
}

public void print() {

    while (laItr.hasNext() && techItr.hasNext()) {
        StudentData laStudent = (StudentData) laItr.next();
        StudentData techStudent = (StudentData) techItr.next();
        System.out.println(techStudent);
        System.out.println(laStudent);
    }
}

}

我尝试使用compareTo()方法进行排序,但它没有用完。我也尝试将两个学生列表排序到一个最终列表中,然后打印出来,但我也无法解决这个问题,在我看来它似乎也违背了使用Iterator模式的目的。

我认为上述信息和代码应该足以评估我如何解决这个问题。关于遵守面向对象原则和结构的评论也是受欢迎的。

由于

1 个答案:

答案 0 :(得分:0)

将下面的解决方案与上面的不完整版本进行比较。这是我提交的最终解决方案:

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

/**
 *
 * @author Philip Skogsberg
 */
public class ProcessStudents {

    Students la = new LAStudents();
    TechStudents tech = new TechStudents();
    StudentsIterator laItr = la.createIterator();
    StudentsIterator techItr = tech.createIterator();

    public void readAll() throws IOException {
        la.read();
        tech.read();
    }

    public void print() {
        ArrayList<StudentData> printList = new ArrayList();
        while (laItr.hasNext() && techItr.hasNext()) {
            StudentData laStudent = (StudentData) laItr.next();
            StudentData techStudent = (StudentData) techItr.next();
            printList.add(laStudent);
            printList.add(techStudent);
            if (laItr.isLast() || techItr.isLast()) {
                Collections.sort(printList);
                for (StudentData s : printList) 
                    System.out.println(s);
            }
        }
    }
}