如何从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
相关产品推荐
相关产品推荐

