2014-01-25 3 views
1

제 문제는 중복을 제거하고 순서를 유지해야하는 List<T>을 받았습니다.복제본을 제거하고 수정 불가능한 클래스의 순서를 유지하십시오.

나는 HashSet을 사용하여 중복을 제거하지만 hashcode을 기반으로하고 있으며 T 클래스는이를 구현하지 않으며 수정할 수 없습니다. 그리고 내가 이해할 때 나는 원래 목록의 주문을 잃을 것이다.

어떻게하면됩니까?

+0

이 컨텍스트에서 "중복"은 무엇을 의미합니까? 동일한 참조 (즉, "==") 또는 'equals()'와 같은가? –

+0

두 가지 요소가 중복되는 기준은 무엇입니까? –

+0

가능하면 평등을 정의하고 싶습니다. – Antoinecoding

답변

1

당신이 지적했듯이, 중복을 제거하는 대부분의 Java 데이터 구조는 hashcode/equals 개의 메소드에 의존합니다.

당신이 T의 코드를 수정하고 평등을 직접 정의 할 수 없기 때문에, 나는 당신이 제대로 hashcode/equals 방법 오버라이드 (override) 할 수있는 당신이 그것의 래퍼를 만들 제안 : 이후

public class MyT { 
    private final T t; 
    public MyT(T t) { this.t = t; } 
    // + getter 
    // + define hashcode and equals based on t 
} 

을 수행 할 수 있습니다 List<T>List<MyT>으로 변환하면됩니다. 그런 다음 hashcode/equals을 기반으로 중복을 제거하고 원래 목록의 순서를 유지하는 LinkedHashSet<MyT>을 사용할 수 있습니다. 마지막으로 필요한 경우 쉽게 List<T>으로 다시 변환 할 수 있습니다.

2

LinkedHashSet 클래스를 살펴보십시오.

+0

그러나'T'는'hashCode()'를 구현하지 않습니다. – arshajii

1

목록이 작고 해시를 전혀 처리하지 않으려면 O (n^2) 솔루션을 사용하여 여러 번 반복하여 중복 된 항목을 찾아 제거하십시오 :

public <T> void removeDups(List<T> listWithDups) 
{ 

    for(int i = 0; i < listWithDups.size(); i++) 
    { 
     T firstItem = listWithDups.get(i); 

     for(int j = i+1; j < listWithDups.size(); j++) 
     { 
      T secondItem = listWithDups.get(j); 

      if((firstItem == null && secondItem == null) || 
       (firstItem != null && firstItem.equals(secondItem)) 
      ) 
      { 
      listWithDups.remove(j); 
      i--; 
      } 
     } 
    } 
} 
관련 문제