2011-08-28 10 views
9

Sto facendo un TreeMap<String, String> e voglio ordinarlo in modo discendente. Ho creato il seguente confronto:Il comparatore <String> deve ignorare il metodo super-classe

Comparator<String> descender = new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     return o2.compareTo(o1); 
    } 
}; 

costruisco la TreeMap in questo modo:

myMap = new TreeMap<String, String>(descender);

Tuttavia, sto ottenendo il seguente errore:

The method compare(String, String) of type new Comparator<String>(){} must override a superclass method 

non ho mai generici completamente rigati, cosa sto sbagliando?

+1

Per quanto posso vedere, niente. L'errore verrebbe causato se il metodo di confronto non corrisponde alla firma del metodo compare() di Comparator, ma non sembra essere il caso per quanto posso vedere. – fwielstra

risposta

17

Il vostro progetto Eclipse è apparentemente impostato su Java 1.5. L'annotazione @Override non è quindi supportata sui metodi di interfaccia. Rimuovere l'annotazione o correggere il livello di conformità del progetto su Java 1.6.

+0

Buona ipotesi lì. –

1

Ah, ho trovato il problema. Quando istanziamo una nuova istanza anonima di Comparable, non sto sovrascrivendo i metodi delle interfacce ... Li sto implementando. La direttiva @ Override era il problema. Il metodo compare() non sostituiva un metodo esistente, ma implementava parte dell'interfaccia. Ho copiato quel codice da un altro posto e non avrebbe dovuto avere @Override.

+3

Il progetto è probabilmente impostato su 1,5 livello sorgente. Dalla versione 1.6 è possibile annotare anche i metodi specificati da un'interfaccia con '@ Override'. –

7

Non è necessario scrivere un numero personalizzato Comparator se si desidera solo invertire l'ordine naturale (crescente).

Per ottenere un ordinamento discendente basta usare:

myMap = new TreeMap<String, String>(java.util.Collections.reverseOrder()); 
+0

Oh, ottimo metodo di convenienza! Grazie! –

Problemi correlati