You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从List<map>中移除booking_no重复的数据?

基于booking_no对List去重的解决方案

现有List<Map<String, Object>>类型的集合message,数据结构如下:

[
  {
       "booking_no": "HC60398",
       "sender_name": "Tanvir",
       "receiver_name": "House",
       "sender_image": "image link",
       "receiver_image": "image link",
       "chat_id": "2",
       "message": "hlw",
       "files": []
  },
  {
       "booking_no": "HC60398",
       "sender_name": "Tanvir",
       "receiver_name": "House",
       "sender_image": "image link",
       "receiver_image": "image link",
       "chat_id": "2",
       "message": "hi"
  },
  {
       "booking_no": "HC60399",
       "sender_name": "Tanvir",
       "receiver_name": "House",
       "sender_image": "image link",
       "receiver_image": "image link",
       "chat_id": "2",
       "message": "hlw",
       "files": []
  }
]

集合中存在booking_no相同但其他字段值不同的元素,使用contains方法无法实现去重,需要移除这些booking_no重复的数据。


方法一:用HashSet记录已出现的booking_no(保留第一个重复元素)

遍历集合时,用HashSet存已经处理过的booking_no,通过add方法的返回值判断是否保留当前元素:

List<Map<String, Object>> uniqueMessages = new ArrayList<>();
Set<String> seenBookingNos = new HashSet<>();

for (Map<String, Object> msg : message) {
    String bookingNo = (String) msg.get("booking_no");
    if (bookingNo != null && seenBookingNos.add(bookingNo)) {
        uniqueMessages.add(msg);
    }
}
  • 逻辑:HashSet.add()在元素不存在时会添加并返回true,存在则返回false,以此过滤重复项
  • 优势:实现简单,时间复杂度低,默认保留第一个出现的重复booking_no元素

方法二:用LinkedHashMap保留插入顺序(可选保留最后一个重复元素)

利用Map键的唯一性,后续相同booking_no的元素会覆盖之前的,最终提取values得到去重结果:

Map<String, Map<String, Object>> tempMap = new LinkedHashMap<>();
for (Map<String, Object> msg : message) {
    String bookingNo = (String) msg.get("booking_no");
    if (bookingNo != null) {
        tempMap.put(bookingNo, msg); // 重复key会覆盖,最终保留最后一个元素
    }
}
List<Map<String, Object>> uniqueMessages = new ArrayList<>(tempMap.values());
  • 逻辑:通过LinkedHashMap维持原集合的元素顺序,同时实现去重
  • 优势:可以选择保留最后一个出现的重复元素,顺序不受影响

方法三:Java 8+ Stream API实现去重

用Stream的collect结合Collectors.toMap,灵活选择保留第一个或最后一个重复元素:

保留第一个出现的元素

List<Map<String, Object>> uniqueMessages = message.stream()
    .collect(Collectors.toMap(
        msg -> (String) msg.get("booking_no"),
        Function.identity(),
        (existing, replacement) -> existing, // 冲突时保留原有元素(第一个)
        LinkedHashMap::new
    ))
    .values()
    .stream()
    .collect(Collectors.toList());

保留最后一个出现的元素

只需修改合并逻辑,替换成保留新元素:

List<Map<String, Object>> uniqueMessages = message.stream()
    .collect(Collectors.toMap(
        msg -> (String) msg.get("booking_no"),
        Function.identity(),
        (existing, replacement) -> replacement, // 冲突时保留新元素(最后一个)
        LinkedHashMap::new
    ))
    .values()
    .stream()
    .collect(Collectors.toList());
  • 优势:代码简洁,适合Java 8及以上版本,同样能维持原集合顺序

内容的提问来源于stack exchange,提问作者Fuad Mostafij

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:15:36