迭代排序的数组以删除重复项

时间:2013-01-17 17:19:28

标签: java arrays iteration

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

我已经对一个数组进行了排序,我需要做的是使用另一个数组来删除重复数据,方法是迭代第一个并比较相邻的项,然后将非重复项添加到新数组中。完成后我将旧数组设置为新数组。我不习惯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 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

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

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

此外,在第一个循环中,即使在第一个操作之后,您仍然用whilelist覆盖newArray,我认为您打算将其移到for之外:

StdOut.println(java.util.Arrays.toString(whitelist));
whitelist = newArray;

答案 2 :(得分:0)

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

答案 3 :(得分: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(零))。