Java中如何在对象构成的嵌套列表中查找重复子列表
识别ArrayList中重复子列表的实现方案
核心逻辑:Java List 接口默认实现的equals方法会按顺序比对两个列表的所有元素值,完全一致时返回true,同时hashCode也会基于所有元素的哈希值计算,因此可以直接作为哈希表的键来统计出现次数和对应索引,不需要额外自定义比较规则。
方案1:统计重复子列表及对应索引位置
该方案可以输出所有重复子列表的具体内容,以及它们在外层列表中出现的所有索引:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class FindDuplicateSubList { public static void main(String[] args) { // 模拟你的业务数据 List<List<String>> compositeKeyValues = new ArrayList<>(); compositeKeyValues.add(List.of("READ", "3GPP_ACCESS")); compositeKeyValues.add(List.of("CREATE", "NON_3GPP")); compositeKeyValues.add(List.of("READ", "3GPP_ACCESS")); compositeKeyValues.add(List.of("MODIFY", "NON_3GPP")); // key为子列表,value为该子列表出现的所有索引集合 Map<List<String>, List<Integer>> subListIndexMap = new HashMap<>(); for (int i = 0; i < compositeKeyValues.size(); i++) { List<String> currentSubList = compositeKeyValues.get(i); subListIndexMap.computeIfAbsent(currentSubList, k -> new ArrayList<>()).add(i); } // 遍历输出重复项 System.out.println("识别到的重复子列表:"); for (Map.Entry<List<String>, List<Integer>> entry : subListIndexMap.entrySet()) { List<Integer> indexes = entry.getValue(); if (indexes.size() > 1) { System.out.printf("子列表%s 出现在索引位置:%s%n", entry.getKey(), indexes); } } } }
运行后输出结果为:
识别到的重复子列表: 子列表[READ, 3GPP_ACCESS] 出现在索引位置:[0, 2]
完全匹配你的需求场景。如果你原始定义的列表是List<Object>类型,只需要在获取当前子列表时做强制类型转换即可:List<String> currentSubList = (List<String>) compositeKeyValues.get(i);
方案2:仅需去重的极简实现
如果你不需要定位重复位置,只需要拿到无重复的子列表集合,直接用HashSet处理即可:
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; // 去重逻辑 Set<List<String>> distinctSubSet = new HashSet<>(compositeKeyValues); List<List<String>> distinctSubList = new ArrayList<>(distinctSubSet);
注意事项
- 如果子列表中存储的是自定义实体类,需要确保实体类重写了
equals()和hashCode()方法,否则会出现匹配错误。 - 子列表的元素顺序会影响匹配结果,顺序不同就算元素相同也会判定为不同的子列表。
内容的提问来源于stack exchange,提问作者misbha afreen
相关产品推荐
相关产品推荐

