0

在对整数数组进行排序后,"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]); 
           }                   
           }
        }
      }
4

3 回答 3

1

由于您正在比较整数对象,因此而不是:

if (arr[i] != arr[i+1])

做这个:

if (!arr[i].equals(arr[i+1]))

请理解!=or==运算符用于比较原语或用于比较对象引用,而不是比较实际的对象值。

顺便说一句,您的代码需要一些重构。如果您真的想查找重复项,有一些更好的方法可以做到这一点,例如使用java.util.Set而不是对数组进行排序来查找重复项。

于 2013-04-17T06:02:03.277 回答
0

问题是您正在Integer使用==. (或者更确切地说,!=。)

当操作数是引用类型表达式时, ==and!=运算符将始终比较引用- 它们比较两个操作数是否是对完全相同对象的引用,而不是它们是否引用相等的对象。

Java 中的装箱保证为Integer-127 到 127 范围内的值使用对象缓存,这就是为什么您看到它适用于某些值的原因。除此之外(或某些点1),您将看到不同的Integer对象,当简单地通过引用进行比较时,这些对象不会相等。您想使用以下方法比较相等性equals

if (!arr[i].equals(arr[i+1]))

1确切的边界是特定于实现的:某些实现可能有更大的缓存。

于 2013-04-17T06:04:09.320 回答
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()) {
于 2013-04-17T06:17:06.663 回答