2011-11-17 58 views
3

我一直在處理一個賦值,該賦值允許用戶將對象輸入到LinkedList中,並將其刪除。除了這裏討厭的部分外,我已經計算出了我的程序的所有區域...刪除重複項。我已經有一段時間了,希望有人能指出我正確的方向。從Java中的LinkedList中刪除重複的元素

我下面的代碼差不多的作品...因爲它刪除了重複...但只有它遇到的第一個元素。那麼,我該如何讓程序查看第一個項目,刪除它的重複項目,然後返回併爲列表中的所有其他元素執行相同操作?我應該使用「previous」還是「current」這樣的節點,而不是我在這裏得到的結果,並試圖以這種方式遍歷LinkedList?我的教授暗示我需要兩個while循環,但我嘗試過的所有方法都無法正常工作。我應該把什麼作爲第二個參數,我假設,外部while循環?

任何幫助非常感謝,謝謝!

public void removeDuplicate() //searches the LinkedList for duplicate elements, and removes them 
    { 
    ListIterator iter = listIterator(); 

    Object uniqueO = iter.next(); 

     while (iter.hasNext()) 
     { 
      String uniqueS = (String) uniqueO; 
      Object compareO = iter.next(); 
      String compareS = (String) compareO; 
      int x = uniqueS.compareTo(compareS); 
      if (x == 0) 
      { 
       iter.remove(); 
      } 
     } 

} //end removeDuplicate 

回答

3

它應該是一種設置方式。 但是,如果你不想改變原有的秩序,這可以幫助:

//這裏,你可以考慮設置爲只是一個數據結構,它決不容忍重複:)

 public void removeDuplicate() //searches the LinkedList for duplicate elements, and removes them 
    { 
    ListIterator iter = listIterator(); 

    HashSet tempSet = new HashSet(); 


     while (iter.hasNext()) 
     { 

     Object obj = iter.next(); 
         if(tempSet.contains(obj))){ 
          iter.remove(); 
         }else{ 
          tempSet.add(obj); 
         } 
     } 

} //end removeDuplicate 
+0

這絕對有效!我想我將不得不放棄使用Set,它比我想要做的要容易得多..感謝您的幫助=] – Dreiak

0

將其轉換爲設置,然後返回到列表。 2行代碼。

+0

確保使用保持原始順序設置。 – Thilo

+0

我的課程還沒有討論過套裝,儘管我已經擡頭看了一下套裝,似乎明白它是如何適用於這種情況的,但這不是一個不幸的選擇...... =/ – Dreiak

1

如果空間是不是一個問題,你可以隨時將其複製到一個新的列表,插入它尚未在新的清單之前驗證:

public static LinkedList<Object> dedup(LinkedList<Object> original) { 
    LinkedList<Object> copy = new LinkedList<Object>(); 

    for (Object o : original) { 
     if (!copy.contains(o)) { 
      copy.add(o); 
     } 
    } 

    return copy; 
} 

你說,你已經有一個add功能的工作,你可以實現一個簡單的包含功能離子很容易,你LinkedList類:

public boolean contains(Object o) { 
    ListIterator iter = listIterator(); 

    while (iter.hasNext()) { 
     if (iter.next().equals(o)) { 
      return true; 
     } 
    } 

    return false; 
} 
+0

我喜歡將列表複製到新列表的想法,因爲空間是絕對不是一個問題。感謝您的輸入! – Dreiak

0

也許這可以幫助你,
新一個HashMap,並採取關鍵環節節點的字符串值,迭代列表時,請檢查開關是否已經存在在hashMap中,如果是的話,就把它刪除。

0
private LinkedList<String> removeDups(LinkedList<String> linkedList){ 
    for(int i=0; i<linkedList.size(); i++){ 
     for(int j=i+1; j<linkedList.size(); j++){ 
      if(linkedList.get(i).equals(linkedList.get(j))){ 
       linkedList.remove(j); 
      } 
     } 
    } 
    return linkedList; 
} 
-1
import java.util.HashSet; 

進口java.util.LinkedList中; import java.util.Iterator;

公共類DeletDuplicateNodeinLinkList {

public static void main(String[] args) { 

    LinkedList<Integer> myLL = new LinkedList<Integer>(); 

    myLL.add(1231); 
    myLL.add(12); 
    myLL.add(12313); 
    myLL.add(123); 
    myLL.add(12313); 
    myLL.add(1); 
    myLL.add(1243242); 
    System.out.println(myLL); 

    myLL = deleteDups(myLL); 
    System.out.println(myLL); 
} 

private static LinkedList<Integer> deleteDups(LinkedList<Integer> myLL) { 
    // TODO Auto-generated method stub 

    HashSet<Integer> myHashSet = new HashSet<Integer>(); 
    Iterator<Integer> itr; 
    itr = myLL.iterator(); 

    while (itr.hasNext()) { 
     if (!myHashSet.add(itr.next())) { 
      itr.remove(); 
     } 

    } 

    return myLL; 
} 

}

+0

向你的代碼添加一些解釋。 – vjdhama