제 문제는 중복을 제거하고 순서를 유지해야하는 List<T>
을 받았습니다.복제본을 제거하고 수정 불가능한 클래스의 순서를 유지하십시오.
나는 HashSet
을 사용하여 중복을 제거하지만 hashcode
을 기반으로하고 있으며 T
클래스는이를 구현하지 않으며 수정할 수 없습니다. 그리고 내가 이해할 때 나는 원래 목록의 주문을 잃을 것이다.
어떻게하면됩니까?
제 문제는 중복을 제거하고 순서를 유지해야하는 List<T>
을 받았습니다.복제본을 제거하고 수정 불가능한 클래스의 순서를 유지하십시오.
나는 HashSet
을 사용하여 중복을 제거하지만 hashcode
을 기반으로하고 있으며 T
클래스는이를 구현하지 않으며 수정할 수 없습니다. 그리고 내가 이해할 때 나는 원래 목록의 주문을 잃을 것이다.
어떻게하면됩니까?
당신이 지적했듯이, 중복을 제거하는 대부분의 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>
으로 다시 변환 할 수 있습니다.
목록이 작고 해시를 전혀 처리하지 않으려면 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--;
}
}
}
}
이 컨텍스트에서 "중복"은 무엇을 의미합니까? 동일한 참조 (즉, "==") 또는 'equals()'와 같은가? –
두 가지 요소가 중복되는 기준은 무엇입니까? –
가능하면 평등을 정의하고 싶습니다. – Antoinecoding