如何修正allDistinct方法以正确判断数组所有元素是否全不重复?
问题:泛型方法
allDistinct无法通过测试用例 我需要编写一个泛型方法allDistinct,接收对象数组,当数组中所有元素全不重复时返回true,否则返回false,且要适配所有类。但我写的代码无法通过测试用例,把==替换成.equals()后还是不对,附上测试结果截图:

我的当前代码:
<T> boolean allDistinct(T[] a) { boolean r = true; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a.length; j++) { if (a[i] == a[j]) { r = false; } } } return r; }
问题分析
你的代码有两个关键错误:
- 内层循环起始位置错误:内层循环从0开始,会让每个元素和自己比较(当i=j时),不管是
==还是equals都会判定为相等,直接把r设为false,导致方法永远返回false。 - 未及时终止循环:即使找到重复元素,仍会继续遍历,虽然不影响最终结果,但完全没必要,浪费性能。
另外,直接用equals还存在空指针风险:如果数组中有null元素,调用a[i].equals(a[j])会抛出NullPointerException。
修复方案
方案1:修正双重循环(时间复杂度O(n²))
调整内层循环的起始位置,同时处理null元素:
<T> boolean allDistinct(T[] a) { for (int i = 0; i < a.length; i++) { // 内层从i+1开始,避免和自身比较,减少重复遍历 for (int j = i + 1; j < a.length; j++) { // 先处理null的情况 if (a[i] == null) { if (a[j] == null) { return false; // 两个null视为重复 } } else if (a[i].equals(a[j])) { return false; // 找到重复,直接返回 } } } return true; // 遍历完无重复,返回true }
方案2:利用Set集合(时间复杂度O(n),更高效)
借助HashSet的特性——不允许重复元素,添加元素时若已存在则返回false:
import java.util.HashSet; import java.util.Set; <T> boolean allDistinct(T[] a) { Set<T> distinctElements = new HashSet<>(); for (T element : a) { // add方法返回false表示元素已存在 if (!distinctElements.add(element)) { return false; } } return true; }
这个方案不仅代码更简洁,效率也更高,而且HashSet天然支持null元素(仅允许一个null),无需额外处理。
内容的提问来源于stack exchange,提问作者Fahim
相关产品推荐
相关产品推荐

