对整数数组"arr"
进行排序后,我尝试识别数组中的重复项。它为数组的一部分执行此操作,但它不识别整个数组中的重复项。我很感激帮助。这是我的代码:
import java.util.*;
public class Ex24 {
public static void main(String[] args) {
int i, n = 100;
Integer[] arr = Collections.nCopies(n, 0).toArray(new Integer[0]);
// int[] array = {0};
for (int j = 0; j < n ; j++){
arr[j] = (int) (Math.random() * 365 + 1);
// System.out.print(j + " " + arr[j] + "\n");
}
Arrays.sort(arr); //sort the arr
// String arrq = (Arrays.toString(arr));
System.out.println("\n");
Duplicate(arr, n);
}
static void Duplicate(Integer[] arr, int n) {
int j = 0;
for (int i = 0; i < n-1 ; i++) {
if (arr[i] != arr[i+1]) {
System.out.println(" at i (" + i + ") print arr[i] " + arr[i]);
}
else {
j = j +1;
System.out.println(" j = " + j + " at i (" + i + ") arr[i] is double at date " + arr[i]);
}
}
}
}
答案 0 :(得分:1)
由于您正在比较整数对象,而不是:
if (arr[i] != arr[i+1])
这样做:
if (!arr[i].equals(arr[i+1]))
请注意,!=
或==
运算符用于比较基元或比较对象引用,而不是比较实际的对象值。
btw你的代码需要一些重构。如果你真的想找到重复项,那么有一些更好的方法可以做到这一点,比如使用java.util.Set
而不是排序数组来查找重复项。
答案 1 :(得分:0)
问题是您使用Integer
比较了==
个引用。 (或者更确切地说,!=
。)
当操作数是引用类型表达式时,==
和!=
运算符将始终比较引用 - 它们比较两个操作数是否是对完全相同的对象的引用,而不是而不是他们是否提到平等的对象。
使用Java中的Boxing保证使用Integer
个对象的缓存来获取-127到127范围内的值,这就是为什么你看到它适用于某些值的原因。除此之外(或某个点 1 ),您将会看到不同的Integer
个对象,当仅通过引用进行比较时,这些对象不会相等。您希望使用equals
方法比较 value 相等:
if (!arr[i].equals(arr[i+1]))
1 确切的边界是特定于实现的:某些实现可能有更大的缓存。
答案 2 :(得分:0)
您将对象与==
比较错误。
if (arr[i] != arr[i+1]) {
使用Integer修复此特定问题的两种方法:
1。
if (!arr[i].equals(arr[i+1])) {
2。
if (arr[i].intValue() != arr[i+1].intValue()) {