comparatore per la Mappa.Voce<K,V>

Ho una Mappa con un tipo di enumerazione come la chiave e Doppio del valore. Voglio ordinare in base al Doppio dei valori. Così ho preso il giornale e si desidera utilizzare Collections.sort() con un comparatore. Ho il seguente codice per il comparatore di

class ScoreComparator<Map.Entry<K, V>> implements Comparator<Map.Entry<K, V>> {
    public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }   
}

Ricevo i seguenti messaggi di errore

  1. Syntax error on token ".", extends expected (line 1).
  2. The type parameter Map is hiding the type Map<K,V> (line 1).
  3. A causa di due errori, K e V non può essere risolto da un tipo (linee 3 e 4).

Io sono in grado di risolvere questo problema. Qualsiasi aiuto è molto apprezzato. Grazie in anticipo.

  • No che non funziona. Ho un “tipo ScoreComparator deve implementare ereditato metodo astratto Comparatore<Mappa.Voce<K,V>>.confrontare(la Mappa.Voce<K,V>, la Mappa.Voce<K,V>)” errore. Implementare il metodo, come illustrato nel codice di cui sopra.
  • Hai ragione, ho modificato la mia risposta qui sotto per rimediare e ancora mantenere il comparatore di come generica si intende.
InformationsquelleAutor Raghava | 2013-06-20

 

One Reply
  1. 10

    Probabilmente si desidera questo:

    //Declare K and V as generic type parameters to ScoreComparator
    class ScoreComparator<K, V extends Comparable<V>> 
    
    //Let your class implement Comparator<T>, binding Map.Entry<K, V> to T
    implements Comparator<Map.Entry<K, V>> {
        public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
    
            //Call compareTo() on V, which is known to be a Comparable<V>
            return o1.getValue().compareTo(o2.getValue());
        }   
    }

    ScoreComparator prende due argomenti di tipo generico K e V. Map.Entry<K, V> non è una valida definizione di tipo generico, ma si può anche utilizzare per associare Comparator<T>‘s T tipo.

    Nota che V deve estendere Comparable<V>, al fine di essere in grado di chiamare compareTo() su o1.getValue().

    È ora possibile utilizzare il sopra ScoreComparator come tale:

    new ScoreComparator<String, String>();
    new ScoreComparator<Long, Integer>();
    //etc...

    Nota, dall’implementazione corrente, probabilmente non serve neanche il K parametro. Alternativa:

    class ScoreComparator<V extends Comparable<V>> 
    implements Comparator<Map.Entry<?, V>> {
        public int compare(Map.Entry<?, V> o1, Map.Entry<?, V> o2) {
    
            //Call compareTo() on V, which is known to be a Comparable<V>
            return o1.getValue().compareTo(o2.getValue());
        }   
    }
    • Grazie per la spiegazione. Che ha fatto il trucco.
    • Vedere l’aggiornamento di risposta per un’alternativa che si può fare senza dichiarare K, che non è nell’attuale implementazione…
    • Grazie. Che certamente è conciso e meglio.

Lascia un commento