Java 动态创建多个列表

Java 动态创建多个列表,java,list,Java,List,我正在尝试创建多个列表,其中将包含从JID发送的相同消息 例如,offlineMessageHeaderList将包含来自不同和相同JID的许多消息。 我想把所有拥有相同JID的人都分组到他们自己的列表中 java version "1.7.0_45" 然后在最后检查哪些是空的,并将它们添加到组列表中 然而,我的解决方案并不好,因为我首先声明了所有内容,并且我可以使用相同的JID获得更多或更少的消息 用于检查和添加的代码段 messageList1 -> all messages fro

我正在尝试创建多个列表,其中将包含从JID发送的相同消息

例如,offlineMessageHeaderList将包含来自不同和相同JID的许多消息。 我想把所有拥有相同JID的人都分组到他们自己的列表中

java version "1.7.0_45"
然后在最后检查哪些是空的,并将它们添加到组列表中

然而,我的解决方案并不好,因为我首先声明了所有内容,并且我可以使用相同的JID获得更多或更少的消息

用于检查和添加的代码段

messageList1 -> all messages from John
messageList2 -> all messages from Peter
etc.
List groupList=new ArrayList();
List messageList1=new ArrayList();
List messageList2=new ArrayList();
List messageList3=new ArrayList();
List messageList4=new ArrayList();
如果(offlineMessageHeaderList.size()>0){
for(OfflineMessageHeader标题:offlineMessageHeaderList){
log.log(Level.INFO,“JID:+header.getJid());
log.log(Level.INFO,“Stamp:+header.getStamp());
log.log(Level.INFO,“User:+header.getUser());
MessageHeader MessageHeader=newmessageheader(header.getJid(),header.getStamp(),header.getUser());
/*检查我们是否已经有此JID的消息列表*/
/*此消息列表1是否已包含此JID消息*/
if(messageList1.get(0.getJid().compareTo(messageHeader.getJid())==0){
/*然后我们将所有相同的Jid添加到此列表中*/
messageList1.add(messageHeader);
}
否则{
/*JID是不同的,所以需要将其添加到新列表中*/
if(messageList2.get(0.getJid().compareTo(messageHeader.getJid())==0){
messageList2.add(messageHeader);
}
}
/*对其他人也这样做*/
}
/*将所有非空列表添加到groupList*/
如果(!messageList1.isEmpty()){
groupList.add(messageList1);
}
如果(!messageList2.isEmpty()){
groupList.add(messageList2);
}
如果(!messageList3.isEmpty()){
groupList.add(messageList3);
}
如果(!messageList4.isEmpty()){
groupList.add(messageList4);
}
}
MessageHeader的类
公共类消息头{
私有字符串mJid;
私有字符串mStamp;
私人弦乐演奏家;
public MessageHeader(字符串jid、字符串戳、字符串用户){
mJid=jid;
mStamp=邮票;
缪斯=用户;
}
公共字符串getJid(){
返回mJid;
}
公共字符串getStamp(){
返回mStamp;
}
公共字符串getUser(){
回归缪斯;
}
}

有什么方法可以更动态地执行此操作吗?

不要创建这样的对象,创建一个引用,当您认为有数据要添加到列表中时,可以创建一个对象,即

    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;
        }
    }
List<MessageHeader> messageList1;// Creating the reference or pass null to it
List<MessageHeader> messageList2;;// Creating the reference or pass null to it
List messageList1;//创建引用或向其传递null
列表消息列表2;;//创建引用或向其传递null
当你检查它为真时,创建一个对象,即

    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;
        }
    }
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){
/*然后我们将所有相同的Jid添加到此列表中*/
messageList1=new ArrayList();//创建一个对象
messageList1.add(messageHeader);
}
否则{
/*JID是不同的,所以需要将其添加到新列表中*/
if(messageList2.get(0.getJid().compareTo(messageHeader.getJid())==0){
messageList2=new ArrayList();//创建一个对象
messageList2.add(messageHeader);
}
}
这样可以避免不必要的对象创建,ArrayList对象


注意:在您的代码中,您正在运行FOR循环,因此请确保一次创建一个ArrayList对象,否则它将始终创建一个新对象,建议增强您的if条件。

如果我理解正确,您可以使用以下方法来最小化对象数量并正确使用数据结构

1) 创建一个
Map
来存储每个JID的所有消息。在映射中,键是JID,值是JID的消息列表

2) 当出现消息时,检查是否存在带JID的钥匙:

如果是-从JID的映射中获取值,该值将返回 一个
列表
对象,并将新消息添加到列表中

如果否-在地图中创建一个新条目,将JID作为键,并创建一个新条目
ArrayList


稍后,您可以在地图中进行迭代,以获得合格的JID,以便插入到组列表中

谢谢您的回答。但不完全是我想要的。因为我不知道我需要多少类型的消息列表。这完全取决于离线消息列表中的JIDs。我期待着把所有同名的圣战者分到不同的名单中。然而,我可以有多达10个不同的。所以我最多可以有10个列表。我希望我更清楚。我现在正在研究另一个解决方案,首先对offlineMessageHeaderList进行排序,看看有多少不同的Jid。谢谢