java聊天怎么信息一左一右_java 聊天消息首页面去重排序

一、需求:

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

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

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

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

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

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

cc6c27436d73dfda42beaf34dfb8e512.png

数据库数据如下:

63bb5c889767f04ec234572d0cee496b.png

二、获取所需数据

(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 findMessagesByDistinctAndCreateTimeDescByMemberId(String memberId) {

List 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()

messagesList.remove(messages);

}

}

}

}

return messagesList;

}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值