2013-07-02 24 views
2

我有下面的代碼有問題:列表存儲最後附加值只有

首先我有一個內部類:

public class TraceMessage{ 
     private String messageType; 
     private String tracedIdentifier; 
     private List<String> content; 



     TraceMessage(){ 
      content = new ArrayList<String>(); 
      messageType=""; 
      tracedIdentifier=""; 
     } 

     TraceMessage(String messageType, String identifier ,List<String> content){ 
      this.messageType = messageType; 
      this.tracedIdentifier = identifier; 
      this.content = content; 
     } 

它有3個屬性的getter和setter方法。我的問題是:

我有這個郵件列表:

private List<TraceMessage> messages = new ArrayList<TraceMessage>(); 

,我想新的元素添加到這個類似:

messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content)); 

,其中溫度是TraceMessage對象。

所以我的問題,當我添加一個消息類型對象到列表的值都很好我甚至把打印輸出到構造函數,它也顯示了良好的價值。但後來當我嘗試使用該列表時,列表中的所有元素都具有相同的內容(最後一個)。可能是什麼問題呢?

以下是完整的部分在哪裏添加消息:

String fileName="tracefile.MTR"; 
     BufferedReader br = new BufferedReader(new FileReader(fileName)); 
     try { 
      String line; 
      TraceMessage temp = new TraceMessage(); 
      while ((line=br.readLine()) != null) { 
       if(line.contains("MSCi")){ 
        temp.content.clear(); 
        temp.content.add(line); 
       } 
       else if(line.contains("CALL PHASE")){ 
        temp.messageType = line.substring(60); 
        temp.content.add(line); 
       } 

       else if(line.contains("CALL ID")){ 
        temp.tracedIdentifier = line.substring(22); 
        temp.content.add(line); 
       } 
       else if(line.contains("END OF REPORT")){ 
        temp.content.add(line); 
        messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));   
       } 
       else{ 
        temp.content.add(line); 
       } 


      } 

     } finally { 
      br.close(); 



     } 
+0

如果'temp'已經是'TraceMessage'對象,爲什麼不直接將它添加到你的'messages'列表?:'messages.add(temp)' – maqjav

+1

這個問題很可能是你沒有顯示我們在這裏真正的代碼,你實際上多次添加相同的對象。你能向我們展示一個能夠再現問題的自包含測試嗎? –

+0

你總是得到相同的物體溫度。 – chetan

回答

0

我會重寫第二個構造帶表的副本

TraceMessage(String messageType, String identifier ,List<String> content){ 
    this.messageType = messageType; 
    this.tracedIdentifier = identifier; 
    this.content = new ArrayList<String>(content); 
} 

這將複製temp.content你是在while重用循環。實例將不受在類之外執行的內容集合的操作的影響。

+0

這對我有用,謝謝! –

0

TraceMessage temp = new TraceMessage(); while循環中

,改變messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));

messages.add(temp);

好吧,如果你不能做到這一點

取代messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));messages.add(temp); messages = new TraceMessage();

+0

我真的不能把它放在循環中,因爲如果我把它放在其中一個塊(if/else)中,其他塊不能看到它 –

+0

@enricko你能告訴我們你的代碼嗎? – maqjav

+0

我編輯了我的問題,現在你可以看到整個代碼 –

0

更改您這樣的代碼:

... 
try { 
    String line; 

    List<String> content = new ArrayList<String>(); 
    String messageType = ""; 
    String tracedIdentifier = ""; 

    while ((line=br.readLine()) != null) { 
     if (line.contains("MSCi")){ 
      content.clear(); 
      content.add(line); 
     } 
     else if (line.contains("CALL PHASE")) { 
      messageType = line.substring(60); 
      content.add(line); 
     } 
     else if (line.contains("CALL ID")) { 
      tracedIdentifier = line.substring(22); 
      content.add(line); 
     } 
     else if (line.contains("END OF REPORT")) { 
      content.add(line); 
      messages.add(new TraceMessage(messageType, tracedIdentifier, content);   
     } 
     else { 
      content.add(line); 
     } 
    } 
} finally { 
    br.close(); 
} 

而不是使用一個temp對象,保存在外部變量的屬性(跳出while循環),然後添加一個新的對象添加到您messages清單,這些變量。

相關問題