2014-11-28 5 views
0

나는 모든 클래스의 객체를 비교할 수있는 범용 비교기를 작성하고 싶습니다. 숫자를 먼저 쓰고 문자열을 입력 한 다음 다른 모든 비교 가능한 객체를 원합니다. 두 개체가 서로 비교되는지 확인하는 방법은 무엇입니까?

먼저 나는

o1 instanceof Comparable && o2 instanceof Comparable 

는 숫자, 문자열 및 기타 모든 비교 클래스 내에서 비교 나에게 줄 것이다 체크를 생각

@SuppressWarnings({ "unchecked", "rawtypes" }) 
      @Override 
      public int compare(Object o1, Object o2) { 

       if(o1 instanceof Number && !(o2 instanceof Number)) { 
        return -1; 
       } 
       else if(o2 instanceof Number && !(o1 instanceof Number)) { 
        return +1; 
       } 
       else if(o1 instanceof String && !(o2 instanceof String)) { 
        return -1; 
       } 
       else if(o2 instanceof String && !(o1 instanceof String)) { 
        return +1; 
       } 
       else if(o1 instanceof Comparable && !(o2 instanceof Comparable)) { 
        return -1; 
       } 
       else if(o2 instanceof Comparable && !(o1 instanceof Comparable)) { 
        return +1; 
       } 
       else if(o1 instanceof Comparable && o2 instanceof Comparable) { 
        return ((Comparable)o1).compareTo(o2); 
       } 
       else { 
        return o1.hashCode() - o2.hashCode(); 
       } 
      } 

을 썼다.

그러나 그 다음에 Number은 비교할 수 없다는 것을 알았습니다. 즉, 정수와 double을 비교할 수 없습니다.

나는 또한 Comparable<T> 계약이 퍼지라는 것을 알았습니다. T은 어떤 클래스라도 될 수 있지만 실제로는 클래스를 구현하는 클래스와 같아야합니다.

그래서 어떻게 수행합니까?

+1

_ 보편적 인 comparator_를 쓰고 싶습니다. 당신은 항상 올바르게 처리하지 않았거나 전혀 처리하지 못한 경우가 있습니다. 그것은 문제를 해결할 것보다 더 두통을 일으킬 것입니다. –

+0

실제로 그렇게 할 수 없기 때문에이를 수행 할 적절한 방법이 없습니다. –

+0

제목 질문에 대한 답은 무엇입니까? –

답변

0

언젠가 나중에 Apple 클래스의 인스턴스와 Orange 클래스의 인스턴스를 만들 것이라고 가정합니다. 어떻게 오늘날 당신이 쓰는 보편적 인 비교 알고리즘이 그 애플 인스턴스와 미래의 오렌지 인스턴스를 비교할 수 있을까요? 나는 당신이 성취하고자하는 것을 다시 생각해보고 그것들을 비교하기 전에 당신의 물건이 같은 등급인지를 확인해야한다고 생각합니다.

관련 문제