2013-01-17 55 views
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)); 
    } 

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

我的输出除了没有删除重复项目也打印出几次。

任何方向将不胜感激。

+0

关于输出的问题,你是循环阵列上每一次打印整个事情。只需调用一次'StdOut.println(java.util.Arrays.toString(newArray));'最后就足够了。 –

+0

尝试决定你的'if(白名单[i + 1]>白名单[i])'陈述后的大括号。将它改为'if(whitelist [i + 1]> whitelist [i]){'并决定'}'应该去的地方。 – OldCurmudgeon

+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)); 
+0

谢谢,我很感激。我接近这一点,但有点关闭。 – jwl4

0

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

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

此外,在第一循环中,您甚至在第一次手术后overwritting的whilelistnewArray,我觉得你的意思是移动这个for外:

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

谢谢,我会尝试这些更改,然后查看我的调试器,看看我是否能够发现重复项目仍未被删除的原因。 – jwl4

0

可能通过在纸上列出算法来帮助你开始任何工作,当你必须为面试编写代码时,这将有所帮助。

0

一般来说,你应该正确地定义equals()和hashCode(),以定义对象的“重复”这个词的含义。但是因为你使用原语和包装(通过装箱/拆箱)你不必在这里做。

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

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(零))。

+0

谢谢你的回应,我知道集合集合,但我们不允许在这里使用它。我并不关心0,因为我还没有通过向新数组添加唯一值来删除重复项。 – jwl4

+0

在上面的代码中,在遍历白名单时,您可以在循环中对其进行修改。 –

+0

为什么如果你可以使用数组和排序,你不能使用集合? –