提问人:smoknovo 提问时间:10/30/2019 最后编辑:Zabuzardsmoknovo 更新时间:10/31/2019 访问量:624
检查数组是否相等 [duplicate]
Check whether arrays are equal [duplicate]
问:
这个问题在这里已经有答案了:
比较 Java 中的数组 (6 个答案)
equals vs Arrays.equals in Java (9 个答案)
在 Java 7 上,equals() 和 deepEquals() (5 个答案)
4年前关闭。
如何检查两个数组中的所有元素是否相同?
如果所有值都相同,如何使其返回?true
我尝试过不同的方法,但都无法成功。
答:
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 中存储第一个一维数组。这将是我们的参考数组,我们将与
targetArray
targetArray
- 我们遍历每个一维数组并将其与
targetArray
array1
- 如果一维数组与我们的引用数组不匹配,则返回
array1
false
- 如果我们到达循环的末尾而没有遇到不相等的一维数组,则返回
true
希望这会有所帮助。
0赞
IlyaMuravjov
10/30/2019
#4
你可以使用 Stream API 和 Arrays#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 它将提供数组子数组流。你可以自己检查一下。
评论
return false
return true