java - 使用迭代器模式java使用一个循环打印出两个数据结构

标签 java design-patterns iterator while-loop

我有一个程序,其中包含来自两所学院的学生的数据,即某所学校的文理学院和理工学院。洛杉矶学院在其类(class)中使用 ArrayList,而科技学院在其类(class)中使用 ArrayList 来保存学生。我已经在这个程序中实现了迭代器模式(用我自己的迭代器),因此有一个迭代器接口(interface),加上一个用于 LAStudents 类的具体迭代器和一个用于 TechStudents 类的具体迭代器。我已经实现了 next() 和 hasNext() 方法。还有一个名为 Students 的学生类接口(interface)类,它定义了 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

洛杉矶学院的学生也有类似的文件。我需要做的是打印出所有学生,包括数组中的学生和 ArrayList 中的学生,并且只需一个循环即可完成。此外,我需要在输出中按姓氏对学生进行排序。这就是我被困住的地方。我意识到我需要一个 Comparator 或者一个 Comparable 类,但我不知道哪个是正确的以及问题的最佳解决方案是什么。是的,这是家庭作业,但我并不是想走捷径,我只是需要一些帮助,以便我可以更好地理解如何对解决方案进行编程。毕竟,它是一个 OO 类。

这是保存有关学生的数据的 StudentData 类。我添加了一个compareTo()方法和一个toString()(除了我最初提供的代码之外)。

公共(public)类 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() 方法,然后迭代两个数据结构并打印输出的类:

公共(public)类(class)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()方法进行排序,但没有成功。我还尝试将两个学生列表排序为一个最终列表,然后打印它,但我也无法弄清楚,而且在我看来,它违背了使用迭代器模式的目的。

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

谢谢

最佳答案

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

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);
            }
        }
    }
}

关于java - 使用迭代器模式java使用一个循环打印出两个数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9817299/

相关文章:

Java EE 6 设计模式

c# - 我怎样才能完全分离我的业务层和数据层?

php - 是否有使用生成器充当迭代器的接口(interface)?

c++ - 将迭代器移动 N 次 C++

java - 使用 Java 解析 HTML 数据(DOM 解析)

java - 难以掌握继承

c# - 存储和使用动态属性

javascript - 验证 Iterator 与 AsyncIterator 类型

带有构造函数的 Java 枚举。通过构造函数参数获取值的最佳方法

java - 字符串ArrayList返回空值