【问题标题】:Checking for duplicates in an int array [duplicate]检查 int 数组中的重复项 [重复]
【发布时间】:2013-10-25 15:13:25
【问题描述】:

这是检查整数数组是否包含重复项的正确方法吗?我想传入一个 int[] nums 而不是 Integer[],但无法让它工作。

public static boolean isUnique(Integer[] nums){
    return new HashSet<Integer>(Arrays.asList(nums)).size() == nums.length;
}

【问题讨论】:

  • 这会给你正确的输出,对吧?所以是正确的。或者你说的其他意思 - 正确的方法
  • @Rohit 这确实有效 - 我想知道这是否是最好的方法。
  • here 很好地回答了您的问题,展示了几种不同的方法和基准。

标签: java hashset


【解决方案1】:

你可以这样做:

public static boolean isUnique(int[] nums){
    Set<Integer> set = new HashSet<>(nums.length);

    for (int a : nums) {
        if (!set.add(a))
            return false;
    }

    return true;
}

这更像是一种类似于短路的方法,而不是您所拥有的方法,一旦遇到重复就返回。更不用说它可以根据需要与int[] 一起使用。我们正在利用 Set#add 返回一个布尔值来指示正在添加的元素是否已经存在于集合中这一事实。

【讨论】:

    【解决方案2】:

    这里不管Set还是排序,排序更优,对象更少。

    public static boolean isUnique(int[] nums) {
        if (nums.length <= 1) {
            return true;
        }
        int[] copy = Arrays.copyOf(nums);
        Arrays.sort(copy);
    
        int old = Integer.MAX_VALUE; // With at least 2 elems okay.
        for (int num : copy) {
            if (num == old) {
                return false;
            }
            old = num;
        }
        return true;
    }
    

    附录正如评论的那样,虽然节省内存,但速度较慢。

    【讨论】:

    • “排序更优化,对象更少。”:排序在O(n*log(n)) 中执行,而向HashSet 添加内容在O(n) 中执行。对于大型数组,排序肯定更糟……
    • @LukasEder:我认为创建 n 个对象超过了排序整数。然而,测试显示,从 ca。 5000 向上你是对的(有很多内存,64 位) - +1。使用 10 000 次排序慢了 5 倍。附:仍然在 ms 范围内。
    • 我怀疑HashSet 及其条目是否会逃离伊甸园空间,因此GC 可能会在离开该方法后不久收集整个HashSet。 JVM 在垃圾收集方面已经变得相当出色......请注意,OP 已经有一个 Integer[] 输入数组,而不是一个 int[] 数组
    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多