You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正allDistinct方法以正确判断数组所有元素是否全不重复?

问题:泛型方法allDistinct无法通过测试用例

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

test results

我的当前代码:

<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;
}

问题分析

你的代码有两个关键错误:

  1. 内层循环起始位置错误:内层循环从0开始,会让每个元素和自己比较(当i=j时),不管是==还是equals都会判定为相等,直接把r设为false,导致方法永远返回false。
  2. 未及时终止循环:即使找到重复元素,仍会继续遍历,虽然不影响最终结果,但完全没必要,浪费性能。

另外,直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:55:56