2015-05-24 129 views
-5

填充的ArrayList這是我的方法:爲什麼我不能在Java中

public void Read() { 
    try{ 
     File fXmlFile = new File("C://Students.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(fXmlFile); 

     doc.getDocumentElement().normalize(); 

     NodeList nList = doc.getElementsByTagName("student"); 

     Student s = new Student(); // Creating a new object 

     for (int i = 0; i < nList.getLength(); i++) { 
      Node nNode = nList.item(i); 

      if (nNode.getNodeType() == Node.ELEMENT_NODE){ 
       Element eElement = (Element) nNode; 

       s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent(); 
       Student.Last_Name = eElement.getElementsByTagName("lastname").item(0).getTextContent(); 

       Student.ID = eElement.getAttribute("id"); 
       Student.Spec = eElement.getElementsByTagName("spec").item(0).getTextContent(); 
       Student.Course = eElement.getElementsByTagName("course").item(0).getTextContent(); 

       Student.Ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent(); 

       students.add(new Student()); 
      } 
     } 
    }catch(Exception e){} 
} 

public static void main(String argv[]){ 
    Student y = new Student(); 
    y.Read();   
} 

,這些都是我的類字段:

ArrayList<Student> students = new ArrayList<>(); 
public static String First_Name; 
public static String Last_Name; 
public static String ID; 
public static String Spec; 
public static String Course; 
public static String Ratingstr; 
public float Rating; 

爲什麼我填充第二 「S」 -object或第二個學生,但不是第一個? 我的意思是當我在第一個週期中用第一個學生的第一個對象寫第一個索引時,我需要用第二個學生填充第二個索引,但是我只填寫第一個,第二個索引僅用第二個學生。我在第二個循環的第一個索引上寫道。這是爲什麼?

+0

你的問題不清楚。你能否重新設計它以明確你需要什麼? –

+1

這篇文章看起來更像是手機上的短信,而不是SO上的問題。 –

+1

不要編輯你的問題,像這樣.... http://stackoverflow.com/help/asking –

回答

0

第一個所有,你不能把students裏面Student類。這不是一個好主意,你必須創建,例如ClassRoomstudents名單:

喜歡的東西:

class Student { 
    public String firstName; 
    public String fastName; 
    public String id; 
    public String spec; 
    public String course; 
    public String ratingstr; 
    public float rating; 
} 

而且

class ClassRoom { 
    ArrayList<Student> students = new ArrayList<>(); 

    // PUT HERE THE READ METHOD!!!! 


    // optional: 
    public String print() { 
     // print each student inside room.students 
     for (Student s : room.students) { 
      // you must have a Student.print() method!!! 
      s.print(); 
     } 
    } 
} 

然後:

public static void main(String argv[]) { 
    ClassRoom room = new ClassRoom(); 
    room.read(); 

    room.print(); 
} 

:你是不是填寫您的數組列表要麼以正確的方式你的對象:

Student.Last_Name 

靜態指的Student類,不Student s情況下,正確的做法是:

s.Last_Name 

此行在學生列表中插入一個新的Student實例,而不是s實例。

students.add(new Student()); 

所以,你的迭代iside ClassRoom類的read方法是這樣的:

if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
    Element eElement = (Element) nNode; 
    s.firstName = eElement.getElementsByTagName("firstname").item(0).getTextContent(); 
    s.lastName = eElement.getElementsByTagName("lastname").item(0).getTextContent(); 
    s.id = eElement.getAttribute("id"); 
    s.spec = eElement.getElementsByTagName("spec").item(0).getTextContent(); 
    s.course = eElement.getElementsByTagName("course").item(0).getTextContent(); 
    s.ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent(); 

    // add the FILLED instance of Student s to ClassRoom.students!!! 
    students.add(s); 
} 

三(可選)

  • 強烈建議你宣佈你Student attribu tes private並創建getter s和setter s來安全地修改它們。

  • Java約定說你的變量名必須以LOWERCASE和你Class名稱與UPPERCASE這樣:class StudentString firstName

+0

「首先,你不能把學生安排進學生班」。很顯然,你'可以'。 –

+1

@AindindDutta @AindindDutta當然你可以放置一個列表並將其命名爲學生... JVM所允許的...但是我正在談論設計問題...期望的結果標誌着可以或不可以做什麼的規則。 ..和期望的結果**在這個具體的案例** SAIS這是一個不被接受的設計規則來存儲學生。 –

-1

您需要在每次循環創造了學生的新實例,你需要填充這個實例,然後你需要的是具體的實例(不是另一個新的)添加到列表,即:

for (int i = 0; i < nList.getLength(); i++) { 
     Node nNode = nList.item(i); 
     if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
      Element eElement = (Element) nNode; 
// create a new instance of the Student in every loop iteration 
      Student s = new Student();// Creating a new object 
// ...and then populate that instance: 
      s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent(); 
... 
// add that specific instance (not another new one) to the list 
      students.add(s); 
+0

問題:每次創建類的新實例都必須使用'Node's?我想'學生'列表必須在'學生類'外面 –

0

請勿使用靜態字段。如果您使用靜態字段,它們對於該類的每個對象都是相同的。

-1

做到這一點。

s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent(); 
s.Last_Name = eElement.getElementsByTagName("lastname").item(0).getTextContent(); 
s.ID = eElement.getAttribute("id"); 
s.Spec = eElement.getElementsByTagName("spec").item(0).getTextContent(); 
s.Course = eElement.getElementsByTagName("course").item(0).getTextContent(); 
s.Ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent(); 

students.add(s); 

而且在循環的開始,使Student一個新的實例。現在你只做了一個。每次運行循環時都應該製作一個。

+0

'學生列表在'學生'裏面,所以每次都不可能填寫新實例...... –

+0

我不太明白你的意思。將一個類的新實例添加到數組列表中是如何「不可能」的? –

+0

我不這樣說...我的意思是學生列表是在學生類裏面...如果你每次迭代都創建一個新的學生實例,你刪除列表...請檢查我的答案,看看我的意思 –

相關問題