2015-09-30 62 views
2
java version "1.7.0_45" 

我試圖創建將包含來自JID發送相同的消息複式列表。創建多個列表動態

例如offlineMessageHeaderList將包含來自不同和相同JID的許多消息。 我想將所有具有相同JID的人分組到自己的列表中。

messageList1 -> all messages from John 
messageList2 -> all messages from Peter 
etc. 

然後在最後檢查哪些是空的並將它們添加到groupList中。

但是,我的解決方案並不好,因爲我首先聲明所有內容,並且可以使用相同的JID擁有更多或更少的消息。

檢查和添加

List<List<MessageHeader>> groupList = new ArrayList<>(); 
    List<MessageHeader> messageList1 = new ArrayList<>(); 
    List<MessageHeader> messageList2 = new ArrayList<>(); 
    List<MessageHeader> messageList3 = new ArrayList<>(); 
    List<MessageHeader> messageList4 = new ArrayList<>(); 

    if(offlineMessageHeaderList.size() > 0) { 
     for(OfflineMessageHeader header : offlineMessageHeaderList) { 
      log.log(Level.INFO, "JID: " + header.getJid()); 
      log.log(Level.INFO, "Stamp: " + header.getStamp()); 
      log.log(Level.INFO, "User: " + header.getUser()); 

      MessageHeader messageHeader = new MessageHeader(header.getJid(), header.getStamp(), header.getUser()); 

      /* Check do we have message list already for this JID */ 
      /* Does this messageList1 already have this JID message */ 
      if(messageList1.get(0).getJid().compareTo(messageHeader.getJid()) == 0) { 
       /* then we add all the same Jid to this list */ 
       messageList1.add(messageHeader); 
      } 
      else { 
       /* The JID was different so need to add it to new list */ 
       if(messageList2.get(0).getJid().compareTo(messageHeader.getJid()) == 0) { 
        messageList2.add(messageHeader); 
       } 
      } 
    /* Do the same for the others */ 
     } 

     /* Add all the non-empty lists to the groupList */ 
     if(!messageList1.isEmpty()) { 
      groupList.add(messageList1); 
     } 

     if(!messageList2.isEmpty()) { 
      groupList.add(messageList2); 
     } 

     if(!messageList3.isEmpty()) { 
      groupList.add(messageList3); 
     } 

     if(!messageList4.isEmpty()) { 
      groupList.add(messageList4); 
     } 

    } 

class of the MessageHeader 
    public class MessageHeader { 
     private String mJid; 
     private String mStamp; 
     private String mUser; 

     public MessageHeader(String jid, String stamp, String user) { 
      mJid = jid; 
      mStamp = stamp; 
      mUser = user; 
     } 

     public String getJid() { 
      return mJid; 
     } 

     public String getStamp() { 
      return mStamp; 
     } 

     public String getUser() { 
      return mUser; 
     } 
    } 

代碼段有什麼辦法,我可以在一個更加動態的方式做到這一點?

回答

1

如果我理解正確,可以使用下面的方法來最小化對象的數量和正確使用數據結構。

1)創建一個Map<String, List<MessageHeader>>來存儲每個JID的所有消息。在Map中,鍵是JID,值是JID的消息列表。

2)發來的郵件,檢查是否有JID的關鍵是存在:

如果是 - 取從地圖爲JID的價值,這將返回 一個List<MessageHeader>對象,並添加新消息放入列表中。

如果否 - 創建內地圖爲重點和新的項目,與JID新 ArrayList<MessageHeader>

以後,你可以通過地圖迭代獲得資格JID用於插入組列表

1

不要創建這樣一個對象,創建一個引用,當你認爲你有數據在列表中添加不是創建一個對象即

List<MessageHeader> messageList1;// Creating the reference or pass null to it 
List<MessageHeader> messageList2;;// Creating the reference or pass null to it 

,當你的支票是真的創建一個對象,即

if(messageList1.get(0).getJid().compareTo(messageHeader.getJid()) == 0) { 
       /* then we add all the same Jid to this list */ 
       messageList1 = new ArrayList<>(); // Create an Object 
       messageList1.add(messageHeader); 
      } 
      else { 
       /* The JID was different so need to add it to new list */ 
       if(messageList2.get(0).getJid().compareTo(messageHeader.getJid()) == 0) { 
        messageList2 = new ArrayList<>(); // Create an Object 
        messageList2.add(messageHeader); 
       } 
      } 

這樣就避免了不必要的對象創建,ArrayList對象。

注意:在您的代碼中,您正在運行FOR循環,因此請確保您創建一個ArrayList對象1單次,否則它將始終創建一個新對象,建議增強您的if條件。

+0

謝謝答案。但不是我正在尋找的東西。因爲我不知道我需要多少種類型的messageList。這一切都取決於offlineMessageHeaderList中的JID。我正在尋找將具有相同名稱的所有JID分組到單獨的列表中。但是,我可以有多達10個不同的。所以我最多可以有10個列表。我希望我更清楚。我現在正在研究另一種解決方案,首先對offlineMessageHeaderList進行排序,以查看首先有多少個不同的JID。謝謝。 – ant2009