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;
}
}
有什么方法可以用更动态的方式做到这一点吗?
答案 0 :(得分: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);
}
}
这样就可以避免不必要的Object创建,ArrayList Object。
注意:在您的代码中运行FOR循环,因此请确保一次创建一个ArrayList对象,否则它将始终创建一个新的Object,建议增强if条件。
答案 1 :(得分:1)
如果我理解正确,您可以使用以下方法来最小化对象数量和正确使用数据结构。
1)创建Map<String, List<MessageHeader>>
以存储每个JID的所有消息。在Map中,键是JID,value是JID的消息列表。
2)当收到消息时,检查是否存在带有JID的密钥:
如果是 - 从JID中获取Map的值,该值将返回 一个
List<MessageHeader>
对象,并将您的新邮件添加到列表中。如果否 - 在Map中创建一个新条目,其中JID为键,为新键
ArrayList<MessageHeader>
稍后您可以遍历地图以获得符合条件的JID以插入群组列表