2013-03-07 46 views
1

我在XML文件上使用SAX解析器來創建引用對象的對象。將XML文件解析爲鏈接的java對象

<?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> 

所以我創建一個進程和教科書和prereqs添加到過程內的各個陣列和完成I的過程添加到陣列。解析後,用戶會被提示輸入課程編號,程序會吐出信息,包括前提條件以及它們所包含的所有內容,以及他們的教科書和前提條件。

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

的問題是添加prereqs我通過已經建立的課程陣列看,如果它的存在,使用它,並創建一個新的,如果它不是時。所以如果它不在那裏,我會添加一個課程,除了它的編號之外,沒有任何信息。所以我最終選擇的課程CSC455有一個prereq CSC365,但沒有列出任何教科書或先決條件。我怎樣才能做到這一點,以便prereqs是完成課程?

+0

你需要做一個兩遍解析;在課程中存儲'String' prereq,然後創建一個'Map '並在課程'resolvePrereq(final Map lookupMap)'上有某種方法,然後循環並調用。 – 2013-03-07 20:39:14

+0

如果您爲「課程」添加源代碼,那麼對於解決方案而言,更容易具體。 – 2013-03-07 20:41:43

+0

這就是我想要做的,但我真的不知道如何。 – DarkLordAllie 2013-03-07 20:48:51

回答

1

您需要維護一個Map來查找您的課程。每當您遇到新的Course或參考時,請檢查地圖,然後將新的Course s放入地圖。通過這種方式,您可以從請求中創建Course,然後再添加信息。

我建議你Course因爲這樣使用List S或Set s就意味着你不會得到一個ArrayOutOfBounds當你有超過5本教科書。

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並使用它來獲得您的課程。它將處理確保你總是參考同一個。