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

Java查找List重复键并关联对应值生成新列表的实现问题

实现逻辑说明

首先纠正一个使用误区:HashMap 本身确实不允许重复键存在,但你完全可以将 Map 的值类型定义为 List<Integer>,碰到相同的键时就把对应的值追加到该键的列表中,完全可以满足你的归类需求。而且 JDK 中所有 List 实现类都重写了 equals() 和 hashCode() 方法,会按元素内容和顺序判断是否相等,直接作为 HashMap 的键是完全合法的。

方案1:基于 HashMap 实现(推荐,时间复杂度O(n))

这是效率最高的实现方式,适合数据量较大的场景:

import java.util.*;

public class GroupList {
    public static void main(String[] args) {
        // 示例输入
        List<List<Integer>> keysList = Arrays.asList(
                Arrays.asList(0, 0, 1, 2, 3),
                Arrays.asList(0, 0, 1, 2, 3),
                Arrays.asList(1, 0, 2, 3, 5)
        );
        List<Integer> valsList = Arrays.asList(4, 2, 3);

        Map<List<Integer>, List<Integer>> tempMap = new HashMap<>();
        for (int i = 0; i < keysList.size(); i++) {
            List<Integer> currentKey = keysList.get(i);
            Integer currentVal = valsList.get(i);
            // 键不存在时自动初始化空列表,存在则直接追加值
            tempMap.computeIfAbsent(currentKey, k -> new ArrayList<>()).add(currentVal);
        }

        // 提取所有值集合即为目标结果
        List<List<Integer>> digitsList = new ArrayList<>(tempMap.values());
        // 输出验证:[[4, 2], [3]]
        System.out.println(digitsList);
    }
}

方案2:暴力遍历实现(无需HashMap,时间复杂度O(n²))

如果你确实不想使用HashMap,适合小数据量场景:

List<List<Integer>> digitsList = new ArrayList<>();
// 标记已经处理过的索引,避免重复归类
boolean[] processed = new boolean[keysList.size()];

for (int i = 0; i < keysList.size(); i++) {
    if (processed[i]) continue;
    List<Integer> subList = new ArrayList<>();
    subList.add(valsList.get(i));
    processed[i] = true;
    // 遍历后续元素匹配相同键
    for (int j = i + 1; j < keysList.size(); j++) {
        if (keysList.get(j).equals(keysList.get(i))) {
            subList.add(valsList.get(j));
            processed[j] = true;
        }
    }
    digitsList.add(subList);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:15:02