0

如果一个名为 x 的给定数组(由用户在另一个方法中输入)包含重复值,我试图让一个方法(重复项)返回 true。否则它会返回假。它不会检查初始化为 100 的整个数组,而是只检查输入的值的数量,并使用全局计数器 numElementsInX 跟踪这些值。

实现这一目标的最佳方法是什么?

public static boolean duplicates (int [] x)

我提示输入用户数据,如下所示:

public static void readData (int [] x, int i){

    Scanner input = new Scanner(System.in);
    System.out.println("Please enter integers, enter -999 to stop");

    while (i <= 99) {
        int temp = input.nextInt();
            if(temp == -999){
                break;
            }
            else {
                x[i++]=temp;
            }

    // else

}//end while
        printArray(x,i);


}//end readData

public static void printArray(int [] x, int numElementsInX){

int n = numElementsInX;

for (int i = 0; i < n; i++){
    System.out.print(x[i] + " ");


}//end for
        System.out.println();
}//end printArray

我确信有更好的方法可以做到这一点,但到目前为止我就是这样被教导的。

4

5 回答 5

6

这是一个解决方案:

  • 编译并执行而不抛出。
  • numElementsInX按您的要求使用。
  • 找到重复项后立即返回。

这种方法测试数组的每个成员是否以前都见过。如果有,该方法可以立即返回。如果没有,则将该成员添加到之前看到的集合中。

public static boolean duplicates (int [] x, int numElementsInX ) {
    Set<Integer> set = new HashSet<Integer>();
    for ( int i = 0; i < numElementsInX; ++i ) {
        if ( set.contains( x[i])) {
            return true;
        }
        else {
            set.add(x[i]);
        }
    }
    return false;
}

这是一个包含上述代码的示例程序

于 2013-07-22T19:56:23.527 回答
4

这应该这样做。

public boolean containsDuplicates(Integer[] x) {
   return new HashSet<Integer>(Arrays.asList(x)).size() != x.length
}

您不需要 numElementsInX 因为这与 x.length 相同

路易斯评论后编辑。Arrays.asList 不适用于 int 数组。

要将 int[] 转换为 Integer,请尝试这个问题How to convert int[] to Integer[] in Java?

或做这样的事情(未经测试,但来自记忆)

Integer[] newArray = new Integer[a.length];
System.arraycopy(a, 0, newArray, 0, a.length);
于 2013-07-22T19:07:31.610 回答
2

这当然不是最有效的方法,但由于您还不知道Sets,您可以使用两个循环:

public static boolean duplicates (int [] x){
    for (int i=0; i<numElementsInX; i++){
        for (int j=i+1; j<numElementsInX; j++){
            if (x[j]==x[i]) return true;
        }
    }
    return false;
}
于 2013-07-22T19:47:32.487 回答
0

"set.add()" 如果元素不存在于集合中,则返回 true,否则返回 false。我们可以利用它并像上面的解决方案一样摆脱“set.contains()”。

public static boolean duplicates (int[] x, int numElementsInX) {
    Set<Integer> myset = new HashSet<>();
    for (int i = 0; i < numElementsInX; i++) {
        if (!myset.add(x[i])) {
            return true;
        }
    }
    return false;
}
于 2015-09-08T16:37:55.160 回答
0

对于 java,如果数组包含重复值,则返回 true,


boolean containsDuplicates(int[] a) {
    
    HashSet<Integer> hs = new HashSet<>();
    
    for(int i = 0; i<a.length; i++) {
        if(!hs.add(a[i])){
            return true;
        }  
    }   
    return false;
}

于 2020-12-09T12:47:30.000 回答