0

XML ファイルで SAX パーサーを使用して、相互に参照するオブジェクトを作成しています。

<?xml version="1.0"?>
<xml encoding="UTF-8" version="1.0"> 
 <course number="CSC212">
  <textbook name="BookFor212"/> 
 </course> 
 <course number="CSC241"> 
  <prereq number="CSC212"/>
  <textbook name="BookFor241"/> 
  <textbook name="AnotherBookFor241"/> 
 </course> 
 <course number="CSC455"> 
  <prereq number="CSC241"/> 
  <prereq number="CSC365"/> 
  <textbook name="BookFor455"/> 
 </course> 
 <course number="CSC365"> 
  <prereq number="CSC241"/> 
  <textbook name="BookFor365"/> 
  <textbook name="AnotherBookFor365"/> 
  <textbook name="YetAnotherBookFor365"/> 
 </course> 
</xml>

そこで、コースを作成し、教科書と前提条件をコース内のそれぞれの配列に追加し、最後にそのコースを配列に追加します。解析後、ユーザーはコース番号を入力するように求められ、プログラムは前提条件とそれに伴うすべての情報を含む情報を吐き出します。したがって、教科書と前提条件も同様です。

public class Course {
private String number;
private Course[] prereqs = new Course[5];
private int pCounter = 0;
private Textbook[] books = new Textbook[5];
private int tCounter = 0;

public Course(String n) {
  number = n;
}

public String getNumber() {
  return number;
}

public void addPrereq(Course prereq) {
  prereqs[pCounter++] = prereq;
}

public void addTextbook(Textbook book) {
  books[tCounter++] = book;
}

public String toString() {
  String retVal = "Course: " + number + (tCounter == 0 ? ", No books." : ", textbooks:   ");
  for (int i = 0; i < tCounter; i++)
    retVal += books[i].toString() + " ";
  retVal += "\n" + (pCounter == 0 ? "No prerequisites.\n" : "Prerequisites:\n");
  for (int i = 0; i < pCounter; i++)
    retVal += prereqs[i].toString();
  return retVal + "End of course " + number + ".\n";
}
}

問題は、前提条件を追加するときに、既に作成されたコースの配列を調べて、そこにある場合はそれを使用し、ない場合は新しいコースを作成することです。そこにない場合は、番号以外の情報がないコースを追加します。したがって、コース CSC455 には前提条件 CSC365 がありますが、教科書や前提条件はリストされていません。前提条件が完成したコースになるようにするにはどうすればよいですか?

4

1 に答える 1

0

Mapコースを検索するには、を維持する必要があります。新しいものや参照に出くわすたびにCourse、マップをチェックしてから、新しいCourses をマップに入れます。このようにCourseして、req から を作成し、後で情報を追加できます。

Lists またはSetsを使用することをお勧めします。これは、教科書が 5 つ以上Courseある場合に が得られないことを意味します。ArrayOutOfBounds

public class Course {

    private String number;
    private List<Course> prereqs = new LinkedList<Course>();
    private List<Textbook> books = new LinkedList<Textbook>();

    public Course(String n) {
        number = n;
    }

    public String getNumber() {
        return number;
    }

    public void addPrereq(Course prereq) {
        prereqs.add(prereq);
    }

    public void addTextbook(Textbook book) {
        books.add(book);
    }

    public String toString() {
        String retVal = "Course: " + number + (books.isEmpty() ? ", No books." : ", textbooks:   ");
        for (final Textbook  book : books) {
            retVal += book.toString() + " ";
        }
        retVal += "\n" + (prereqs.isEmpty() ? "No prerequisites.\n" : "Prerequisites:\n");
        for (final Course course : prereqs) {
            retVal += course.toString();
        }
        return retVal + "End of course " + number + ".\n";
    }
}

ここで、新しいコースを作成するのではなく、使用するメソッドを保存しMap<String, Course>て追加する必要があります。これはファクトリ パターンです。getCourse()

private class CourseFactory {

    private final Map<String, Course> courseMap;

    public CourseFactory(final Map<String, Course> courseMap) {
        this.courseMap = courseMap;
    }

    public Course getCourse(final String name) {
        Course course = courseMap.get(name);
        if(course == null) {
            course = new Course(name);
            courseMap.put(name, course);
        }
        return course;
    }
}

したがって、パーサーの上部で を作成し、CourseFactoryそれを使用してコースを取得します。常に同じものを参照するようにします。

于 2013-03-07T21:05:00.873 に答える