Java查找数组重复值时重复输出,如何仅输出唯一重复值
问题根因
你原来的双重循环逻辑会对每一组重复的元素配对都触发打印:拿测试样例[1,2,2,2,3]举例,值为2的元素下标是1、2、3,循环会匹配到(1,2)、(1,3)、(2,3)三组配对,因此触发三次打印。
修改方案
我们可以新增一个集合存储已经输出过的重复值,避免重复打印,修改后的完整代码如下:
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class duplicateValue { // 方法名修改为更贴合功能的findDuplicate,原reverse命名不符合功能语义 public static void findDuplicate(int[] a) { // 存储已经打印过的重复值,避免重复输出 Set<Integer> printedDuplicates = new HashSet<>(); for(int i=0;i<a.length;i++) { for(int j=i+1;j<a.length;j++) { if(a[i]==a[j]) { // 仅当该重复值未被打印过才输出 if (!printedDuplicates.contains(a[i])) { System.out.println(a[i] + " is duplicated"); printedDuplicates.add(a[i]); } // 找到重复后直接跳出内层循环,避免后续无意义匹配 break; } } } } public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("enter the size of array"); int n=sc.nextInt(); System.out.println("enter the "+n+" no. of elements"); int[] a=new int[n]; for(int i=0;i<n;i++) { a[i]=sc.nextInt(); } findDuplicate(a); sc.close(); } }
修改点说明
- 新增
HashSet类型的printedDuplicates变量,用来记录已经输出过的重复值 - 匹配到重复值后先判断是否已经在集合中,不存在才打印并加入集合
- 匹配到重复值后直接跳出内层循环,减少不必要的遍历
- 补充了
Scanner资源的关闭操作,避免资源泄漏 - 修正了方法命名,原
reverse语义和功能不符,改为findDuplicate - 修正了输入提示的文本格式,把
"+n+"no.改为"+n+" no.更易读
内容的提问来源于stack exchange,提问作者Mahesh Divate
相关产品推荐
相关产品推荐

