2013-03-05 3 views
0

클래스 A의 경우 X 및 Y의 두 가지 속성이 있습니다. 속성 X를 검사하여 클래스 2의 동등성을 찾을 수 있도록 ClassA의 메소드를 대체했습니다.기준에 따라 삽입 중에 중복 요소를 제거합니다.

ClassA { 

Integer X,Y; 

Integer getX(){return X;} 
Integer getY(){return Y;} 

boolean equals(object o){ 
     return getX().equals((ClassA)o).getX()); 
} 

} 

이제 ClassA의 모든 중복 요소를 목록에서 제거하고 싶습니다. 그러나 두 요소가 중복 된 것으로 발견되면 논리를 추가하여 Y 기준에 따라 중복 요소를 제거하려고합니다. 그래서 기본적으로 내가 이웃 중복 요소 목록을 정렬 볼려고 노력하고 우리의 논리에 기반 중복 제거 될 분명히

if(A.eqauls(B)){ 
    remove A , if A.getY() > B.getY() 
    ore remove B , if A.getY() < B.getY() 
} 

아래처럼 간다. 세트를 사용하여이 작업을 수행 할 수 있는지 궁금합니다.

답변

0

집합은 equals() 메서드를 사용하여 요소가 이미 설정되어 있는지 확인합니다. 다른 말로하면, 세트에 삽입 된 첫 번째 것은 정상적인 삽입을 사용하는 경우 붙어있는 것입니다.

자신이 설정 한 클래스를 구현하지 않는 한이 동작을 재정의 할 수 있다고 생각하지 않습니다. 추가 클래스를 구현하면 이라는 Y 비교도 동일하게 테스트 할 수 있습니다.

0

add()은 (equals() 방법에 따라) 이미 세트에있는 요소와 동일하면 요소를 추가하지 않는다는 내용의 Set 일반 계약을 위반하지 않고이 작업을 수행 할 수 없습니다. 이 동작을 구현하는 경우 Set을 사용할 수 있습니다 (특정 X 값을 가진 요소를 이미 확인했는지 확인할 수 있음). Map은 약간 더 나은 선택이 될 것입니다.

동작은 목록을 정렬하고 반복하여 구현하기가 쉽기 때문에이를 사용합니다. Set을 사용하여 구현 시간이나 유지 보수성 측면에서 어떤 것도 얻지는 않습니다 (아마도 코드를 읽기가 더 어렵게 만든다고 할 수 있습니다). 그래서 정말 더 나은 옵션입니다. 이 같은

1

뭔가 : 당신이 목록에서 같은 요소의 순서를 유지하려면

Map<ClassA, ClassA> map = new HashMap(); 

for(ClassA elem : yourList) 
{ 
    ClassA existing = map.get(elem); 
    if(existing != null) 
    { 
     if(check your condition using "elem" and "existing" and getY) 
     { 
     continue;// don't replace the element in the map. 
     } 
    } 
    map.put(elem, elem); 
} 
//map.values() will have your elements 

당신은 대신 LinkedHashMap를 사용할 수 있습니다.

현재, HashSet은 HashMap을 사용하여 비슷한 방식으로 구현됩니다.

관련 문제