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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:09