检查数组是否相等 [duplicate]

Check whether arrays are equal [duplicate]

提问人:smoknovo 提问时间:10/30/2019 最后编辑:Zabuzardsmoknovo 更新时间:10/31/2019 访问量:624

问:

如何检查两个数组中的所有元素是否相同?

如果所有值都相同,如何使其返回?true

我尝试过不同的方法,但都无法成功。

Java 数组 比较 相等

评论

4赞 deHaar 10/30/2019
您必须比较元素,如果您发现一对不相同的元素,或者检查并发现所有元素都相同。return falsereturn true
1赞 Zabuzard 10/31/2019
你为什么要删除你的代码?切勿以使现有答案无效的方式编辑您的问题。

答:

4赞 Mushif Ali Nawaz 10/30/2019 #1

可能尝试这样的事情:

public static boolean checkIdentical(int[][] targetArray) {
    for (int i = 1; i < targetArray.length; i++) {
        for (int j = 0; j < targetArray[i].length; j++) {
            if (targetArray[i][j] != targetArray[0][j]) {
                return false;
            }
        }
    }
    return true;
}

警告:

如果数组可以具有可变长度,如下所示:

int[][] identicalArray = {{3, 3, 3, 4}, {3, 3, 3}};

那么条件将是:

if (targetArray[i].length != targetArray[0].length
        || targetArray[i][j] != targetArray[0][j]) {
    return false;
}

评论

0赞 RoyM 10/30/2019
使用强制不是很多不必要的查找吗?.. != targetArray[0][j]
1赞 Kayaman 10/30/2019
@RoyM什么是不必要的查找?
1赞 Mushif Ali Nawaz 10/30/2019
@RoyM访问具有 O(1) 时间复杂度。由于基于索引的数组提供常量读取。targetArray[0]
1赞 RoyM 10/30/2019
@MushifAliNawaz好吧,明白了。谢谢!
1赞 smoknovo 10/30/2019
我只是试了一下,但没有用。也许我把它放在错误的地方。我太累了。我再试一次tmmrw。谢谢你的帮助。
4赞 Leni 10/30/2019 #2

您可以使用 Arrays.equals() 方法在单个循环中完成。

public static boolean checkIdentical(int[][] targetArray) {
    int[] prev = null;
    for (int[] a : targetArray) {

        if (prev != null && !Arrays.equals(a, prev))
            return false;

        prev = a;
    }
    return true;
}

需要导入 java.util.Arrays。

评论

1赞 Mushif Ali Nawaz 10/30/2019
但是里面会有一个循环.因此,从技术上讲,它不是一个单一的循环解决方案。Arrays.equals()
2赞 Leni 10/30/2019
我想也应该有一个内部循环。但是,为什么要通过再次编写笨拙的循环代码来重新发明轮子呢?同意两者可能具有相同的时间复杂度。谢谢你的指出。
1赞 ieggel 10/30/2019 #3

一个可能的解决方案在这里:

public static void main(String[] args) {
    int[][] identicalArray = { { 3, 3, 3 }, { 3, 3, 3 } };
    int[][] nonIdenticalArray = { { 1, 2, 3 }, { 3, 2, 1 } };

    System.out.println("identicalArray all identical? " + checkIdentical(identicalArray));
    System.out.println("nonIdenticalArray all identical? " + checkIdentical(nonIdenticalArray));
}


public static boolean checkIdentical(int[][] targetArray) {
    int[] array1 = targetArray[0];
    for(int[] array : targetArray) {
        if (!Arrays.equals(array1, array))
            return false;
    }
    return true;
}

在checkIdentical中会发生什么:

  • 我们在参数中收到一个二维targetArray
  • 我们在 array1 中存储第一个一维数组。这将是我们的参考数组,我们将与targetArraytargetArray
  • 我们遍历每个一维数组并将其与targetArrayarray1
  • 如果一维数组与我们的引用数组不匹配,则返回array1false
  • 如果我们到达循环的末尾而没有遇到不相等的一维数组,则返回true

希望这会有所帮助。

0赞 IlyaMuravjov 10/30/2019 #4

你可以使用 Stream APIArrays#equals 来写优雅的 1 行:checkIdentical

public static boolean checkIdentical(int[][] targetArray) {
    return Stream.of(targetArray).allMatch(elm -> Arrays.equals(targetArray[0], elm));
}

评论

0赞 Mushif Ali Nawaz 10/31/2019
难道不会提供单个元素 () Stream 吗?Stream.of(targetArray)int[][]
0赞 IlyaMuravjov 10/31/2019
@MushifAliNawaz 它将提供数组子数组流。你可以自己检查一下