zoukankan      html  css  js  c++  java
  • java 聊天消息首页面去重排序

    一、需求:

      在展示聊天首页面时,需满足以下条件:

      A与B聊天,A既可以是发送者,也可以是接收者;B同样可以为发送者或接受者。

    (1)去重复:若A与B聊天,对A→B,或B→A只显示一条;

    (2)聊天内容的排序:A与B聊天,显示最新一条聊天内容;

    (3)对所获取的聊天集合按时间倒叙排列。

    如:最终所需展示内容如下

    数据库数据如下:

    二、获取所需数据

    (1)方案一,使用sql直接查询:

    SELECT * FROM messages mes WHERE NOT EXISTS ( SELECT * FROM messages WHERE mes.id < id AND ((mes.mfrom = mfrom AND mes.mto = mto) OR

    ( mes.mfrom = mto AND mes.mto = mfrom )))AND (mes.mfrom = '4d5e6acb7efa4b67826cfff440b3d12c ' OR mes.mto = '4d5e6acb7efa4b67826cfff440b3d12c ')

    ORDER BY mcreated_time DESC;

      注:因为id为自增字段主键,所以对id排序即对时间排序,解决了时间相同问题;A—B与B—A为同一聊天对象。

    (2)方案二,使用sql+java代码实现:

    sql语句为:

    SELECT * FROM messages mes WHERE NOT EXISTS (SELECT * FROM messages WHERE mes.mfrom=mfrom AND mes.`id` < id )
    AND (mes.mfrom = '4d5e6acb7efa4b67826cfff440b3d12c ' OR mes.mto = '4d5e6acb7efa4b67826cfff440b3d12c ') ORDER BY mes.mcreated_time DESC;

    因为只按照mfrom去重,聊天双方都可是mfrom,也可是mto,所以还存在重复,需进一步去重,可用java代码实现:

    public List<Messages> findMessagesByDistinctAndCreateTimeDescByMemberId(String memberId) {
    List<Messages> messagesList = messageRepository.findMessagesByDistinctAndCreateTimeDescByMemberId(memberId);
    for (int i = 0; i < messagesList.size(); i++) {
    Messages messages = messagesList.get(i);
    String messagesForm = messages.getMessagesForm();
    String messagesTo = messages.getMessagesTo();
    for (int j = 0; j < messagesList.size(); j++) {
    Messages messages2 = messagesList.get(j);
    String messagesForm2 = messages2.getMessagesForm();
    String messagesTo2 = messages.getMessagesTo();
    if (messagesForm.equals(messagesTo2) && messagesTo.equals(messagesForm2)) {
    if(messages.getId()<messages2.getId()) {
    messagesList.remove(messages);
    }
    }
    }
    }
    return messagesList;
    }

    注:核心为从list集合中去除满足条件的重复数据。

  • 相关阅读:
    软件工程导论P53,习题2.4
    视图和数据表的区别
    无法从“object”转换为“string”
    Oracle 密码重置
    Struts2 上传下载
    Spring 事务管理
    JSP 指令和动作
    JS 禁用回车、后退事件、form 表单不可编辑
    关于 in 和 exist 的理解
    Oracle clob 操作函数
  • 原文地址:https://www.cnblogs.com/qqzhulu/p/10491860.html
Copyright © 2011-2022 走看看