2017-04-15 16 views
0

생성자 내부에 익명 비교자를 작성하는 데 문제가 있습니다.비교기에 대한 캐스트를 사용하는 생성자의 익명 비교 자

우리가 가

private Comparator<K> _comparator; 

우리의 데이터 strcture도있다

을 사용하고, 그러나

를 "키 타입이 비교 된 것으로 가정 코드, 즉, Comparable를 구현"다음과 같이 나의 지침입니다 노드의 개인 클래스 :

private static class Node<K,V> extends AbstractEntry<K,V> { 
    Node<K,V> left, right; 
    Node(K k, V v) { 
     super(k,v); 
     left = right = null; 
    } 
} 

내가 이런 식으로를 작성하려고 않았다

public TreeMap() { 

    _comparator = (Comparator<K>) new Comparator<Node<K,V>>(){ 
     @Override 
     public int compare(Node<K, V> o1, Node<K, V> o2) { 
      return ((Integer) o1.getKey()).compareTo((Integer) o2.getKey()); 

     } 
    }; 
} 

그러나 우리는 노드를 비교하지 않거나 그 키가 정수라고 가정하므로 정확하지 않습니다. 나는 또한 Comparable에 체크되지 않은 캐스트를 사용하기로되어 있는데, 이것을 어떻게 또는 어디에서 할 것인지를 알 수 없다. 다음과 같이

할당에서 실제 지침은 다음과 같습니다

가 작성하는 클래스에서 두 개의 생성자가 있습니다 하나가 null이 아니어야 키 유형에 대한 비교를합니다. 다른 하나는 그렇지 않지만,이 생성자를 사용하면 코드에서 키 유형이 비교 가능하다고 가정해야합니다. 즉, Comparable을 구현합니다. 그런 다음이 가정은 compareTo 메소드를 사용하여 작업을 수행하는 비교기를 만드는 데 사용됩니다.

힌트 또는 아이디어를 제공해 주시면 감사하겠습니다.

+0

우리가 노드를 비교하는 안돼요 * * : 당신은 무엇입니까 비교할 거니? 비교기는 무엇을 위해 사용됩니까? 지시 사항은 무엇입니까? –

+0

더 많은 정보가 있으면 도움이 될 것입니다. – mmsky

답변

1

확인. 따라서 자연 순서를 사용하여 비교 가능한 키를 정렬하는 비교자를 작성해야합니다. 나는. compareTo 메소드에 위양해야합니다. 당신이 정말로 익명의 내부 클래스로 작성하려는 경우

그래서 당신이

Comparator<K> comparator = (a, b) -> ((Comparable<K>) a).compareTo(b); 

원하는 또는 :

Comparator<K> comparator = new Comparator<K>() { 
    @Override 
    public int compare(K a, K b) { 
     return ((Comparable<K>) a).compareTo(b); 
    } 
}; 
+0

오! 내가 참조. Comparable 내에서 compareTo를 호출하면 compareTo를 호출합니다 ... 나는 Comparable을 선언 어딘가에 캐스팅하려고 계속 노력했습니다. 정말 고맙습니다! 나는 이것에 영원히 갇혀 있었다. – mmsky