2011-11-17 3 views
3

나는 사용자가 LinkedList에 Object를 입력하고 제거 할 수있는 작업을 수행하고 있습니다. 나는이 성가신 부분을 제외하고는 내 프로그램의 모든 영역을 알아 냈다 ... 중복을 제거하라. 나는 지금 당분간이 일을 해왔고, 누군가가 나를 올바른 방향으로 인도 할 수 있기를 바랬다.Java의 LinkedList에서 중복 요소 제거

내가 가지고있는 코드는 입니다.과 같이 작동합니다 ... 중복 된 내용은 삭제되지만 ... 만나는 첫 번째 요소 만 삭제합니다. 그렇다면 프로그램에서 첫 번째 항목을보고 중복 항목을 삭제 한 다음 다시 돌아와 목록의 다른 모든 항목에 대해 동일한 작업을 수행하도록 허용하려면 어떻게해야합니까? 내가 여기에있는 것보다 "이전"과 "현재"와 같은 노드를 사용해야하고 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

확실히 잘 작동합니다! 나는 내가 사용하려고했던 것보다 훨씬 쉽습니다. 도움을 주셔서 감사합니다.] – Dreiak

0

집합으로 변환 한 다음 목록으로 되돌립니다. 2 줄의 코드.

+0

원래 순서를 유지하는 설정을 사용해야합니다. – Thilo

+0

우리는 아직 세트에서 논의하지 않았지만, 세트를 찾아 보았지만이 상황에서 어떻게 작동하는지 이해하고있는 것처럼 보이지만 불행히도 여기서는 옵션이 아닙니다 ... =/ – Dreiak

1

를 용납하지처럼 데이터 구조를 설정 고려할 수 있습니다 관심사가 아닌, 당신은 항상 새로운 목록에 아직 삽입하기 전에 확인, 새 목록에 복사 할 수 있습니다 : 당신은 이미 add 기능의 작동을 가지고 언급 한

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; 
} 

, 당신은 할 수 간단한 기능을 구현한다. 이온 비교적 쉽게, 당신의 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에 있다면, 그냥 제거하십시오.

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