查找仅在恰好2个相同ArrayList中出现的两个1~10整数
嘿,这个需求我get到了!你要找的是两个数字,它们不仅都只出现在2个列表里,而且这两个列表还完全一模一样,对吧?我给你整理了个清晰的解决思路,再附上Java代码示例,应该能帮你搞定:
核心解决思路
其实关键就是先给每个数字“绑定”它所在的所有列表,再按共享的列表集合来分组,具体分四步:
- 第一步:统计每个数字的出现列表
遍历所有ArrayList,用一个映射表记录每个数字出现在哪些列表里(可以用列表的索引或者自定义名称来标识列表)。 - 第二步:筛选目标数字
只保留那些恰好出现在2个列表里的数字,毕竟你的需求限定了是“仅出现在2个列表”的数字。 - 第三步:按共同列表分组
把筛选后的数字,按照它们共享的列表集合来分组——比如所有都在List1和List4里的数字会被分到同一组。 - 第四步:提取符合条件的数字对
只要分组里有至少2个数字,那这些数字就是你要找的,对应的分组key就是它们共同的列表。
Java代码示例
import java.util.*; public class NumberListMatcher { public static void main(String[] args) { // 模拟你的9个ArrayList,这里填的是示例数据,你可以替换成自己的列表 List<List<Integer>> allLists = new ArrayList<>(); allLists.add(Arrays.asList(2, 3, 5)); // 列表0(对应你的List1) allLists.add(Arrays.asList(1, 4, 6)); // 列表1(对应你的List2) allLists.add(Arrays.asList(7, 8, 9)); // 列表2(对应你的List3) allLists.add(Arrays.asList(2, 3, 10)); // 列表3(对应你的List4) allLists.add(Arrays.asList(1, 5, 7)); // 列表4(对应你的List5) allLists.add(Arrays.asList(4, 6, 8)); // 列表5(对应你的List6) allLists.add(Arrays.asList(9, 10, 2)); // 列表6(对应你的List7) allLists.add(Arrays.asList(3, 5, 7)); // 列表7(对应你的List8) allLists.add(Arrays.asList(1, 4, 9)); // 列表8(对应你的List9) // 步骤1:统计每个数字所在的列表索引集合 Map<Integer, Set<Integer>> numberToLists = new HashMap<>(); for (int listIndex = 0; listIndex < allLists.size(); listIndex++) { List<Integer> currentList = allLists.get(listIndex); for (int num : currentList) { // 自动初始化空集合,避免空指针 numberToLists.computeIfAbsent(num, k -> new HashSet<>()).add(listIndex); } } // 步骤2:筛选出仅出现在2个列表中的数字 Map<Integer, Set<Integer>> filteredNumbers = new HashMap<>(); for (Map.Entry<Integer, Set<Integer>> entry : numberToLists.entrySet()) { if (entry.getValue().size() == 2) { filteredNumbers.put(entry.getKey(), entry.getValue()); } } // 步骤3:按共享的列表集合分组数字 Map<Set<Integer>, List<Integer>> listGroupToNumbers = new HashMap<>(); for (Map.Entry<Integer, Set<Integer>> entry : filteredNumbers.entrySet()) { int num = entry.getKey(); Set<Integer> listSet = entry.getValue(); listGroupToNumbers.computeIfAbsent(listSet, k -> new ArrayList<>()).add(num); } // 步骤4:输出最终结果 System.out.println("符合条件的数字对及所在列表:"); for (Map.Entry<Set<Integer>, List<Integer>> entry : listGroupToNumbers.entrySet()) { List<Integer> matchedNumbers = entry.getValue(); Set<Integer> targetLists = entry.getKey(); // 只输出有至少2个数字的分组(满足你找两个数字的需求) if (matchedNumbers.size() >= 2) { // 如果需要显示列表名称而非索引,你可以提前建一个索引到名称的映射表 System.out.printf("数字:%s,共同出现在列表索引:%s%n", matchedNumbers, targetLists); } } } }
小提示
- 如果不想用列表索引,而是想用自定义名称(比如List1、List4),可以加一个
Map<Integer, String> listNameMap,比如listNameMap.put(0, "List1"),输出的时候把索引转换成对应名称就行。 - 如果有多个数字共享同一组2个列表,代码也能一并输出,比如三个数字都符合条件的话,也会显示出来。
内容的提问来源于stack exchange,提问作者Tamer
相关产品推荐
相关产品推荐

