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

