1

让我首先说一个我遇到麻烦的家庭作业问题。

我已经对一个数组进行了排序,我需要做的是使用另一个数组通过迭代第一个数组并比较相邻项然后将非重复项添加到新数组来删除重复项。完成后,我将旧数组 = 设置为新数组。我不习惯 java,因此我遇到了一些我认为正确设置迭代的问题。

public static void main(String[] args) {
    args = new String[] { "data/list1.txt" };
    StdIn.fromFile("data/list2.txt");
    // StdOut.toFile ("finished.txt");
    int[] whitelist = In.readInts(args[0]);

    Arrays.sort(whitelist);
    int newArray[] = new int[whitelist.length];
    for (int i = 0; i < whitelist.length-1; i++) {
        int k = 0;
        if(whitelist[i+1] > whitelist[i])
            newArray[k] = whitelist[i];
            k++;
        StdOut.println(java.util.Arrays.toString(whitelist));
        whitelist = newArray;
        }
    for (int i=0; i<newArray.length;i++){
        StdOut.println(java.util.Arrays.toString(newArray));
    }

这段代码是更大的二进制搜索的一部分,但这是我遇到问题的部分。

我的输出除了没有删除重复项外还打印了好几次。

任何方向将不胜感激。

4

4 回答 4

1

由于不使用集合等限制,您的代码可以通过这种方式重写,并且可以正常工作:

    Arrays.sort(whitelist);
    int newArray[] = new int[whitelist.length];
    newArray[0] = whitelist[0];
    int k = 1;
    for (int i = 0; i < whitelist.length - 1; i++) {
        if(whitelist[i+1] > whitelist[i]) {
            newArray[k] = whitelist[i + 1];
            k++;
        }
    }
    newArray = Arrays.copyOf(newArray, k);
    whitelist = newArray;
    System.out.println(Arrays.toString(newArray));
于 2013-01-17T19:49:02.090 回答
0

仅适用于第一if条指令,k++ 在每次迭代中递增。你应该使用:

if (whitelist[i+1] > whitelist[i]) {
        newArray[k] = whitelist[i];
        k++;
}

此外,在第一个循环中,即使在第一次操作之后,您也会覆盖whilelistwith newArray,我认为您的意思是将其移出for

StdOut.println(java.util.Arrays.toString(whitelist));
whitelist = newArray;
于 2013-01-17T17:25:16.510 回答
0

它可以通过在纸上概述算法来帮助您开始任何工作,当您必须为面试编写代码时它会有所帮助。

于 2013-01-17T17:47:10.773 回答
0

一般来说,您应该正确定义 equals() 和 hashCode(),以定义“重复”一词对您的对象意味着什么。但是由于您使用原语和包装器(通过装箱/拆箱),因此您不必在此处执行此操作。

然后你应该把你的数组放入一些 Set 集合中。所有重复项将被自动消除。之后将 Set 放回 Array。

Java 内置机制将以最优化的方式删除重复项。您不必手动执行此操作。

    Integer[] whitelistI = null;
    Set set = new HashSet(Arrays.asList(whitelist));
    whitelistI = (Integer []) set.toArray(new Integer[set.size()]);

如果你需要一个原语数组,你可以从 whitelistI 复制它。

此外,这是错误的:

int newArray[] = new int[whitelist.length];

您的新数组将与原始数组的长度相同,但您说要删除重复项。如果您删除重复项,它的实际大小会变短,并且您的新数组将具有空值(在您的情况下 - 0(零))。

于 2013-01-17T18:41:51.680 回答