Использование одного цикла для распечатки двух структур данных с использованием шаблона итератора Java - PullRequest
1 голос
/ 22 марта 2012

У меня есть программа, в которой хранятся данные о студентах из двух колледжей, гуманитарного колледжа и технического колледжа какой-то школы. Колледж Лос-Анджелеса использует ArrayList в своем классе, а Технический колледж использует и массив в своем классе для хранения студентов. Я внедрил шаблон итератора (со своим собственным итератором) в эту программу и поэтому имею интерфейс итератора плюс один конкретный итератор для класса LAStudents и один для класса TechStudents. Я реализовал методы next () и hasNext (). Существует также интерфейсный класс для студенческих классов, который называется «Студенты», который определяет метод 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, но я не знаю, какой из них правильный и как лучше всего решить проблему. Да, это домашняя работа, но я не пытаюсь срезать углы , я просто хочу помочь, чтобы лучше понять, как запрограммировать решение. В конце концов, это класс ОО.

Вот класс 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 (), но это не сработало. Я также попытался отсортировать оба списка учеников в один окончательный список, а затем распечатать его, но я не могу понять это, также мне кажется, что он отрицает цель использования шаблона итератора.

Я думаю, что приведенной выше информации и кода должно быть достаточно для оценки того, как я могу решить эту проблему. Комментарии по поводу соблюдения принципов и структуры ОО также приветствуются.

Спасибо

1 Ответ

0 голосов
/ 05 мая 2013

Сравните приведенное ниже решение с неполной версией выше.Это было окончательное решение, которое я представил:

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