查找数组比较中的不同索引



我正试图通过教程学习一点Java,目前我正在努力编写一段代码,我应该找到数组之间的索引差异(如果有差异的话)

我的代码
Scanner scanner = new Scanner(System.in);
int[] arrOne = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int[] arrTwo = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int sumArrOne = 0;
int index = 0;
boolean diff = false;
for (int k : arrOne) {
if (Arrays.equals(arrOne, arrTwo)) {
sumArrOne += k;
} else {
for (int i : arrTwo) {
if (k != i) {
index = i;
diff = true;
break;
}
}
}
}
if (diff) {
System.out.println("Found difference at " + index + " index.");
} else {
System.out.println("Sum: " + sumArrOne);
}  

所以,如果数组是相同的,我是arrOne中数组元素的总和。如果它们不相同->必须显示它们不在哪个索引。

当我输入

1 2 3 4 5
1 2 4 3 5

我应该得到的差值是索引2而不是索引1

我不太清楚为什么,如果有人指出我的错误在哪里,我会很高兴。

我更新了你的代码。看来你还误解了索引的概念。

使用一个共同的索引来检查在两个数组中,在我的例子中,它被简单地称为i:

import java.util.Arrays;
import java.util.Scanner;
public class BadArray {
static private final int INVALID_INDEX = Integer.MIN_VALUE;
public static void main(final String[] args) {
try (final Scanner scanner = new Scanner(System.in);) {

final int[] arrOne = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
final int[] arrTwo = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int sumArrOne = 0;
int diffIndex = INVALID_INDEX;
final int minLen = Math.min(arrOne.length, arrTwo.length);
for (int i = 0; i < minLen; i++) {
sumArrOne += arrOne[i];
if (arrOne[i] != arrTwo[i]) {
diffIndex = i;
break;
}
}
if (diffIndex != INVALID_INDEX) {
System.out.println("Found difference at " + diffIndex + " index.");
} else if (arrOne.length != arrTwo.length) {
System.out.println("Arrays are equal but have different length!");
} else {
System.out.println("Sum: " + sumArrOne);
}
}
}
}

我还将扫描器放入try-resource-catch中,以正确处理资源释放。

注意,如果不同的数组长度起着更重要的作用,你也可以在一开始就进行数组长度的比较。

您试图找出哪个索引具有第一个差异,因此您应该通过索引进行迭代,而不是使用for-each循环(又称增强的for循环)。下面的方法应该可以解决这个问题。

/**
* Returns the index of the first element of the two arrays that are not the same.
* Returns -1 if both arrays have the same values in the same order.
* @param left an int[]
* @param right an int[]
* @return index of difference or -1 if none
*/
public int findIndexOfDifference(int[] left, int[] right) {
// short-circuit if we're comparing an array against itself
if (left == right) return -1;
for (int index = 0 ; index < left.length && index < right.length ; ++index) {
if (left[index] != right[index]) {
return index;
}
}
return -1;
}

在代码中,您比较的是索引不同的地方,而不是索引处的值。此外,您的代码还有其他几个问题。我将一步一步地讲解它们:

// compare the whole array only once, not inside a loop:
diff = !Arrays.equals(arrOne, arrTwo));
if (!diff) {
// do the summing without a loop
sumArrOne = Arrays.stream(arrOne).sum();
} else {
// find the difference
// it could be the length
index = Math.min(arrOne.length, arrTwo.length); 
// or in some different values
for (int i = 0; i < index; i++) { // do a loop with counter
if (arrOne[i] != arrTwo[i]) {
index = i;
break;
}
}
}

我在循环上方设置index并不重要,因为它的值无论如何都会在循环中被覆盖,如果相关的话。

相关内容

  • 没有找到相关文章

最新更新