2013-01-17 80 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

爲什麼如果你可以使用數組和排序,你不能使用集合? –