如何检查整个2d数组中的重复项?

时间:2017-11-13 05:20:10

标签: java arrays duplicates

我是初学者,只是学习数组。我最近学习了2d数组,我试图找出是否在2d数组中有重复。我知道如何检查同一列或行中是否存在重复,但我无法弄清楚如果数字与我尝试将其进行比较的数字不在同一列或行中,如何比较数字。这是我现在的代码:

public static boolean correctNumbers(int[][] values) {
    for (int i = 0; i < values.length; i++) {
        for (int j = 0; j < values[i].length; j++) {
            int num = values[i][j];
            for (int k = j + 1; k < values.length; k++) {
                if (num == values[i][k] || num > values.length * values.length || num < 1) {
                    return false;
                }
            }
            for (int l = i + 1; l < values.length; l++) {
                if (num == values[l][j] || num > values.length * values.length || num < 1) {
                    return false;
                }
            }
        }
    }

    return true;
}

我需要创建一个方法,我不能在创建它时使用任何其他方法。 谢谢你的帮助!

编辑:如果数组中有重复项,则数组中的数字小于1,或者大于数组中元素的总数,则返回false。换句话说,此方法检查数组是否包含数组中1到(i * j)的所有值。我意识到我在解释那部分方面做得不好。再次感谢!

1 个答案:

答案 0 :(得分:0)

你可以通过将数字保存到一个哈希集来简化逻辑,当你迭代它们时,检查它们是否已经存在(意味着重复),否则添加它:

public static boolean correctNumbers(int[][] values) {
    Set<Integer> set = new HashSet<>();
    for (int i = 0; i < values.length; i++) {
        for (int j = 0; j < values[i].length; j++) {
            int num = values[i][j];
            if (set.contains(num)) {
                return false;
            }
            set.add(num);
        }
    }
    return true;
}

修改

我们可以使用数组来实现hashset在上面的代码中所做的相同功能:

public static boolean correctNumbers(int[][] values) {
    int n = values.length;
    int[] dict = new int[n * n + 1];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < values[i].length; j++) {
            int num = values[i][j];
            if (num < 1 || num > n || dict[num] != 0) {
                return false;
            }
            dict[num] = 1;
        }
    }
    return true;
}