有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java动态创建多个列表

java version "1.7.0_45"

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

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

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

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

然而,我的解决方案并不好,因为我首先声明了所有内容,并且我可以使用相同的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;
        }
    }

有没有什么方法可以让我更具活力


共 (2) 个答案

  1. # 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条件

  2. # 2 楼答案

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

    1)创建一个Map<String, List<MessageHeader>>来存储每个JID的所有消息。在地图中,键是JID,值是JID的消息列表

    2)当信息出现时,检查是否有带JID的钥匙:

    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