2014-11-24 5 views
0

Pre-TL; DR : 비교기가 다른 비교기의 인스턴스이거나 다른 비교기의 인스턴스인지 여부를 확인해야합니다.반전 된 비교기와 원본의 동등성을 확인하는 방법은 무엇입니까?

안녕하세요,이 문제는 매우 간단하다고 생각하지만 너무 많이 생각하고 있습니다. 사용자가 다른 비교 자별로 목록을 정렬 할 수있는 프로그램이 있습니다. 사용자는 오름차순 또는 내림차순을 선택할 수 있습니다. 비교기는 오름차순으로 기본적으로 있기 때문에, 모든 나는 순서가 새로운 반전 비교기를 만드는 것입니다 내림차순 달성하기 위해 수행

Comparator newReversedCMP = Collections.reverseOrder(Comparator originalComp) 

프로그램의 또 다른 부분은 사용자가 정렬하거나 마지막을 볼 수 있도록 마지막으로 사용한 비교를 저장 비교기가 사용됩니다. 긴 소개에 대한

if (lastCMPUsed.equals(new NameComparator()){ 
    return "Name"; 
} 
if (lastCMPUsed.equals(new SalaryComparator()){ 
    return "Salary"; 
} 

미안하지만 내 문제는 내가 또한 "이름"또는 "을 반환 할 것입니다 :의 내가 예를 들어, 이름과 급여와 그것을 다루는 무엇을 반환하는 방법을 다루는 비교기 있다고 가정 해 봅시다 Salary "와 반대 인 경우에도 마찬가지입니다. lastCMPUsed가 reversedOrder CMP이면, 그것들은 동일하지 않습니다.

나는하지만 성공이 시도 :

//lastCMPUsed = Collections.reversedOrder(new NameComparator()); if (lastCMPUsed.equals(Collections.reverseOrder(new NameComparator()) return "Name";

이것은 "이름"을 반환하지 않는 그들을 같지 않은 것으로 본다. 각 비교 자의 My equals 메서드는 간단한 인스턴스 검사입니다.

읽어 주셔서 감사합니다.

+0

글쎄, 그들은 근본적으로 같은 비교기가 아니므로 물론 '평등'은 작동하지 않습니다. 이런 논리는 iffy 디자인처럼 보인다. 왜 문자열 이름을 따로 저장할 수 없습니까? –

+0

확인할 새 Object를 만드는 이유는 무엇입니까? 왜 클래스 속성을 사용하지 않습니까? if (lastCMPUser.getClass(). equals (NameComparator.class) 또는 심지어 instanceof – mprabhat

+0

나는이 문제에 대한 샘플 코드를 제공하려고 시도하면서 실제로 총을 뛰었습니다. 실제로이 문제를 해결했습니다.이 질문은 삭제할 수 있습니다. if lastCMPUsed.equals (Collections.reverseOrder (new NameComparator()) "Name"을 반환합니다. lastCMPUsed가 NameComparator의 역순 인 경우 실제로 작동합니다. – theSack

답변

0

the supertype으로 정의 된 평등 이외의 특정 정의가 필요한 경우 적절하게 수행 할 클래스 구조를 작성해야합니다. 예를 들어

는 :

NAME.getClass() == NAME_REVERSE.getClass() // true 
NAME instanceof PersonComparator.Name   // 
    &&          // true 
NAME_REVERSE instanceof PersonComparator.Name // 
NAME == NAME_REVERSE       // false 
NAME.equals(NAME_REVERSE);     // false 
:

public abstract class PersonComparator implements Comparator<Person> { 
    private final boolean isReversed; 

    private PersonComparator(boolean isReversed) { 
     this.isReversed = isReversed; 
    } 

    public boolean isReversed() { 
     return isReversed; 
    } 

    @Override 
    public int compare(Person lhs, Person rhs) { 
     return isReversed ? compareImpl(rhs, lhs) : compareImpl(lhs, rhs); 
    } 

    public abstract String getComparison(); 
    protected abstract int compareImpl(Person lhs, Person rhs); 

    public static final class Name extends PersonComparator { 
     private Name(boolean isReversed) { super(isReversed); } 
     @Override 
     protected int compareImpl(Person lhs, Person rhs) { 
      return lhs.getName().compareTo(rhs.getName()); 
     } 
     @Override 
     public String getComparison() { 
      return "Name"; 
     } 
    } 

    public static final Name NAME   = new Name(false); 
    public static final Name NAME_REVERSE = new Name(true); 
} 

여기 평등 즉 각각의 가능한 비교기의 단일 인스턴스가 있기 때문에 내가 equalshashCode를 오버라이드 (override) 할 필요가 없었다

NAME.getComparison()       // 
    .equals(NAME_REVERSE.getComparison())  // true 

참고.