java - 动态创建多个列表

标签 java list

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) 创建 Map<String, List<MessageHeader>>存储每个 JID 的所有消息。在 Map 中,键是 JID,值是 JID 的消息列表。

2) 当消息到来时,检查是否存在带有 JID 的 key :

if yes - fetch the value from the Map for the JID, which would return a List<MessageHeader> object and add your new message into the list.

if No - Create a new entry within Map, with JID as key and a new ArrayList<MessageHeader>

稍后您可以迭代映射以获取符合条件的 JID 以插入到组列表中

关于java - 动态创建多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32858938/

相关文章:

java - 为什么 java.util.ArrayList.remove(int index) 对于以下代码无法正常工作?

java - 为什么 java 在...复杂时返回 java.util.LinkedHashMap

java - 删除和收缩 ArrayList

Java-Vaadin 如何设置变量包含任何类型的字段?

python - 将 2D 列表转换为字典,其中重复值转换为键,其余值转换为列表

java - 对象引用未保存的 transient 实例 : save the transient instance before flushing

java - 如何从线性布局中删除边框线

python - 检查列表理解中列表的长度(基于列表理解中元素的计数迭代)

java - Applet 在 Google Chrome 上挂起

java - 在 Java 中调用 wait() 时,所有 Swing 框架都得到 "frozen"