注册

IM即时聊天消息怎么按时间来排序

最近在做一个IM的即时通讯的项目,现在有遇到一个问题是需要把每次收到的消息(单聊,群聊,**)都排到最前面,类似于手机QQ收到消息的效果
我用了三个hashmap来保存三种不同类型的消息 主要是做本次缓存,加载速度快。

三个hashmap的结构如下

//用户消息 String - user_username //(key:用户名 value:该用户与不同好友的聊天记录)

//用户消息 String - user_username
public static HashMap> userMessages = new HashMap>();

//群组消息 String - group_gid
public static HashMap> groupMessages = new HashMap>();

//系统转发的请求 String - sys_msgtype
public static HashMap> sysMessages = new HashMap>();



我目前想的一个办法是用linkedlist来存储所有的消息,不管是**还是单聊或群聊的消息。然后当有新消息到来的时候就会去查询是否这个messages对象是否已经存在,如果存在删除, 然后通过addFirst()方法将他添加到表头,这样最近来的消息就排到置顶了。不过这种方式的效率很低,今天想了很久没有想到更好的办法,如果有大家有更好的办法请帮个忙,谢谢了。


附上代码

/**
* 保存单聊消息
* @param name 聊天好友的名字 作为key
* @param message 消息对象
*/
public void saveSingleMsg(String name, ChatMessage message) {
ArrayList messages = AppData.userMessages.get("user_"+name);
//如果此用户对应的消息集合不存在就创建一个新的
if (messages == null) {
messages = new ArrayList();
}
messages.add(message);
//保存单聊消息 根据用户名来保存消息
AppData.userMessages.put("user_" +name, messages);
if(mLinkedList.contains(messages)){
mLinkedList.remove(messages);
}
mLinkedList.addFirst(messages);
}



已邀请:
消息都有时间字段,根据这个排序
是因为查找的问题,链表查找的很慢,你可以考虑用TreeSet;具体用那种方法需要你去查找下;另外,TreeSet的好处是它是有序容器中查找最快的。当然其他方面比如遍历,空间,增删方面就不占优势了。而你是打算做即时聊天的,虽然不能保证来源信息完全有序,但是一般不会差太多。通常要找的也就是最后那几个而已。所以可以考虑从最后一个开始手动逆序查找,理论上会比容器提供的查找会快很多。

要回复问题请先登录注册