如何过滤Google Guava Multimap中的互斥重复条目?
处理Guava ArrayListMultimap中的互斥重复条目
要移除ArrayListMultimap中像URL1=URL2和URL2=URL1这样的互相对应重复条目,可按以下思路实现:
核心逻辑
通过定义固定的筛选规则,确保每一对双向映射只保留一个方向的条目,比如基于字符串的字典序判断,或者自定义业务规则,避免重复存储。
具体代码实现
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; public class MultimapDeduplicator { public static void main(String[] args) { // 你的原始Multimap实例 Multimap<String, String> ourToolMappings = of.finalMappings(); // 初始化去重后的Multimap Multimap<String, String> deduplicatedMap = ArrayListMultimap.create(); // 遍历所有键值对 for (String key : ourToolMappings.keySet()) { for (String value : ourToolMappings.get(key)) { // 处理自身映射的情况(如URL=URL) if (key.equals(value)) { deduplicatedMap.put(key, value); continue; } // 按字典序规则保留条目:仅当键的字典序小于值时添加,同时跳过已存在的反向条目 if (key.compareTo(value) < 0) { deduplicatedMap.put(key, value); } else if (!deduplicatedMap.containsKey(value) || !deduplicatedMap.get(value).contains(key)) { deduplicatedMap.put(key, value); } } } // 替换原始Multimap为去重后的结果 ourToolMappings.clear(); ourToolMappings.putAll(deduplicatedMap); } }
关键说明
- 字典序规则:利用
compareTo方法判断字符串顺序,保证每对双向映射只保留一个,你也可以替换为自定义的比较逻辑(比如字符串长度、业务标识排序等)。 - 重复校验:处理键序更大的条目时,先检查反向条目是否已被添加,避免重复存储。
- 自映射兼容:单独处理
key=value的情况,直接保留这类无反向重复的条目。
内容的提问来源于stack exchange,提问作者user23424056
相关产品推荐
相关产品推荐

