如何在Java中接收用户输入的两个列表并找出其中的公共元素?
Java中找出两个列表公共元素的实现方案
下面是几种实用的实现方式,覆盖不同场景需求:
方法一:利用集合retainAll()方法
这是最简洁的原生方案,直接借助Java集合框架的交集方法。注意retainAll()会修改原集合,因此建议先创建列表副本再操作。
import java.util.ArrayList; import java.util.List; public class CommonElementsFinder { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(List.of(1, 2, 3, 4, 5)); List<Integer> list2 = new ArrayList<>(List.of(3, 4, 5, 6, 7)); // 创建list1的副本,避免修改原列表 List<Integer> commonElements = new ArrayList<>(list1); commonElements.retainAll(list2); System.out.println("公共元素:" + commonElements); // 输出 [3, 4, 5] } }
说明:如果列表包含重复元素,该方法会保留与原列表一致的重复次数(比如list1是[2,2,3]、list2是[2,4],结果为[2,2])。
方法二:哈希集合优化遍历
当列表数据量较大时,List.contains()的O(n)查询会导致O(n²)的时间复杂度,改用HashSet的O(1)查询可大幅提升效率。
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class CommonElementsFinder { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(List.of(1, 2, 3, 4, 5)); List<Integer> list2 = new ArrayList<>(List.of(3, 4, 5, 6, 7)); Set<Integer> set1 = new HashSet<>(list1); List<Integer> commonElements = new ArrayList<>(); for (Integer num : list2) { if (set1.contains(num)) { commonElements.add(num); // 可选:若无需保留重复公共元素,添加后移除避免重复匹配 // set1.remove(num); } } System.out.println("公共元素:" + commonElements); // 输出 [3, 4, 5] } }
方法三:Stream API实现(Java 8+)
用Stream的过滤操作简化代码,适合Java 8及以上版本,同样可结合哈希集合优化性能。
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class CommonElementsFinder { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(List.of(1, 2, 3, 4, 5)); List<Integer> list2 = new ArrayList<>(List.of(3, 4, 5, 6, 7)); // 优化版:先转HashSet提升过滤效率 Set<Integer> set2 = new HashSet<>(list2); List<Integer> commonElements = list1.stream() .filter(set2::contains) .collect(Collectors.toList()); System.out.println("公共元素:" + commonElements); // 输出 [3, 4, 5] } }
方法四:精确匹配重复元素的交集
如果需要严格匹配元素的重复次数(比如list1有2个2、list2有3个2,结果保留2个2),可通过Map统计元素出现次数实现。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CommonElementsFinder { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(List.of(2, 2, 3, 3, 3)); List<Integer> list2 = new ArrayList<>(List.of(2, 2, 2, 3, 4)); // 统计list1中各元素的出现次数 Map<Integer, Integer> countMap = new HashMap<>(); for (Integer num : list1) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } List<Integer> commonElements = new ArrayList<>(); for (Integer num : list2) { if (countMap.containsKey(num) && countMap.get(num) > 0) { commonElements.add(num); countMap.put(num, countMap.get(num) - 1); } } System.out.println("公共元素:" + commonElements); // 输出 [2, 2, 3] } }
内容的提问来源于stack exchange,提问作者Muskan Verma
相关产品推荐
相关产品推荐

