2012-03-01 5 views
2

私は2つのクラスを持ち、それぞれがIteratorを返します。そこにはStudentという名前の値を返すクラスがあります。このコードでは、あるクラスを反復処理することができます。私は、Machineクラスで2番目のクラスを追加することなく、他のクラスを反復処理する方法があるかどうかを知りたいと思います。ここのように私のコードがどのように見えるかです:ただ1つのイテレータで2つのリストを反復するJava

import java.util.*; 
import java.lang.reflect.*; 

class ClassRoom1{ 
    ArrayList<Student> al = new ArrayList<Student>(); 
    Student st; 
    public ClassRoom1(){ 
     st = new Student("Michael", "Smith", 12); 
     al.add(st); 
     st = new Student("Jennifer", "Lopez", 13); 
     al.add(st); 
    } 

    public void addStudent(String name, String lastName, int age) { 
     Student st = new Student(name, lastName, age); 
     al.add(st); 
    } 

    public ArrayList getStudents(){ 
     return al; 
    } 

    public Iterator returnIter(){ 
     Iterator iter = getStudents().iterator(); 
     return iter; 
    } 
} 

class ClassRoom2{ 
    ArrayList<Student> al = new ArrayList<Student>(); 
    Student st; 
    public ClassRoom2(){ 
     st = new Student("Brian", "Con", 15); 
     al.add(st); 
     st = new Student("Megan", "Bell", 15); 
     al.add(st); 
    } 

    public void addStudent(String name, String lastName, int age) { 
     Student st = new Student(name, lastName, age); 
     al.add(st); 
    } 

    public ArrayList getStudents(){ 
     return al; 
    } 

    public Iterator returnIter(){ 
     Iterator iter = getStudents().iterator(); 
     return iter; 
    } 
} 

public class Machine{ 
    Student st; 
    ClassRoom1 clrm1 = new ClassRoom1(); 
    ClassRoom2 clrm2 = new ClassRoom2();  

    public static void main(String[] args){ 
     Machine mch = new Machine(); 
     ArrayList al = new ArrayList(); 
     Iterator iter = al.iterator(); 
     mch.printStudens(iter); 
    } 

    void printStudens(Iterator iter){ 
     iter = clrm1.returnIter(); 
     while(iter.hasNext()){ 
      st = (Student) iter.next(); 
      System.out.println("\nName: " + st.getName() + "\nLast name: " + st.getLastName() + "\nAge: " + st.getAge()); 
     } 
    } 
} 
+3

私はJennifer Lopezを満たすために教室1に行きます:) さらに、ループ内に2つのイテレータを使用する必要があります。 – vulkanino

+0

本当にイテレータを使用する必要がありますか? – hurtledown

+0

私はかなり理解していません。内部ループを持つ必要はありませんが、別のイテレータを持つ必要があります。あなたの質問を編集して、あなたのループで何をしようとしているかについてさらに詳しい情報を提供できますか? – Gray

答えて

4

まず、コードの複製ではなく、OO:

class ClassRoom{ 
    private List<Student> al; 
    public ClassRoom1(List<Student> studentList){ 
     a1 = new ArrayList(studentList); 
    } 

    public void addStudent(String name, String lastName, int age) { 
     al.add(new Student(name, lastName, age)); 
    } 

    public List<Student> getStudents(){ 
     return al; 
    } 

    public Iterator<Student> returnIter(){ 
     return getStudents().iterator(); 
    } 
} 

clrm1clrm2はClassRoomのオブジェクトです。実際には、任意の多くのClassRoomオブジェクトを独自のリストに保持して、ネストされた繰り返しを実行することができます。まず、すべてのClassRoomsに対して、現在のClassRoomのすべての生徒を反復処理します。


更新:

一度イテレータ(ここではありません必要性)を結合する必要がある場合は、私はどちらか私自身の小さな連接イテレータを書きたいこれは、例えば順番に、保持しているイテレータを繰り返し処理するか、または複数のイテレータを1つのイテレータに結合するGuavaのIterator.concat()を使用します。いずれにしても、データを複製する必要はありません。

0

私はそれがタイプだ似た名前の変数を呼び出すことはありません(変更する可能性がある)、それが含まれるかと:

ArrayList<Student> students = new ArrayList<Student>(); 

I addStudentメソッドが名前、姓、年齢ではなくStudentを受け入れるように変更されます。

public void addStudent(Student newStudent) 
    { 
      students.add(newStudent); 
    } 

その後、同様に学生を追加することができます。

class1.addStudent(new Student("jennifer", "lopez", 30)); 

しかし、また、異なるクラスに同じ生徒を追加します。

Student jennifer = new Student("jennifer", "lopez", 30); 
class1.addStudent(jennifer); 
class2.addStudent(jennifer); 

は最後に、はい、あなたは、ループ内の2回の反復子を必要とします:)

0

あなたのデザインは完全に間違っています。各(学校)ClassRoomに対して2つの異なる(Java)クラスを作成しないでください。 1つだけ作成します。

public class ClassRoom 
{ 
    ... all your stuff here 

    public void addStudent(Student st) 
    { 
     students.add(st); 
    } 

    public List<Student> getStudents() 
    { 
     return students; 
    } 
} 

その後、あなたは、このような複数のクラスを作成し、配列にそれらを置くことができます。

List<ClassRoom> rooms = new ArrayList<ClassRoom>(); 

ClassRoom room1 = new ClassRoom("5 Latin Sience"); 
room1.addStudent(new Student("Anna", "Bell", 12)); 
room1.addStudent(new Student("Martin", "Foo", 12)); 
room1.addStudent(new Student("Stef", "Bar", 12)); 


ClassRoom room2 = new ClassRoom("4 Maths"); 
room2.addStudent(new Student("Anna", "Bell", 11)); 
room2.addStudent(new Student("Martin", "Foo", 11)); 
room2.addStudent(new Student("Stef", "Bar", 15)); 

// put them int the array. 
rooms.add(room1); 
rooms.add(room2); 

さて、あなたは各クラスの部屋を反復し、その後で各学生を反復処理することができますforループを入れ子になった:

for (ClassRoom room : rooms) 
{ 
    for (Student st : room.getStudents()) 
    { 
     System.out.println(... student details here ...); 
    } 
} 
0

私は悪いデザインについての回答に同意するが、実際の質問は以下のコードは動作するはず両方のリストに1つのイテレータを取得答えること。アレイコピーのために計算コストがかかるので、リンクリストを使用してそれを軽減したい場合があります。

clrm1.getStudents().clone().addAll(clrm2.getStudents()).iterator(); 

別のオプションは、学生のリストとflattening iteratorでClassオブジェクトのリストを使用することです。

0

2つの教室で異なるクラスの理由は見当たりません。それらは同じです。 - 教室なしイテレータのための唯一のクラス(我々は彼らを必要としない)

public class Machine{ 

    // a list of classrooms 
    List<Classroom> classRooms = new ArrayList<Classroom>(); 

    // just to start the application 
    public static void main(String[] args){ 
     Machine machine = new Machine(); 
     machine.printStudents(); 
    } 

    public Machine() { 
     // we initialize the classrooms 
     // Note - a machine wouldn't create classes, this is just for the demo 
     Classroom class1 = new Classroom(); 
     class1.addStudent("Michael", "Smith", 12); 
     class1.addStudent("Jennifer", "Lopez", 13); 
     classRooms.add(class1); 

     Classroom class2 = new Classroom(); 
     class2.addStudent("Brian", "Con", 15); 
     class2.addStudent("Brian", "Con", 15);   
     classRooms.add(class2); 
    } 

    void printStudents() { 
     for (Classroom class:classrooms) { 
     // one could print the classname at this place 
     for (Student student: class.getStudents()) { 
      System.out.println("\nName: " + st.getName() + "\nLast name: " + st.getLastName() + "\nAge: " + st.getAge()); 
     } 
     } 
    } 
} 

これはあなたのソリューションとは全く異なる:

public class Classroom { 
    // each classroom has a list of students 
    List<Student> students = new ArrayList<Student>(); 

    // each classroom has a method to add a new student 
    public void addStudent(String name, String lastName, int age) { 
    Student st = new Student(name, lastName, age); 
    al.add(st); 
    } 

    // each classroom has a method to "show" his students 
    public List<Student> getStudents() { 
    return students; 
    } 
} 

は今、あなたはマシンを持っています。それを試して、あなたのコードと比較してください。

関連する問題