2012-12-30 18 views
6

Eventuali duplicati:
How can I sort the keys of a Map in Java?Che cos'è l'ordinamento naturale in una TreeMap?

In classe TreeMap l'API Java dice: implementazione NavigableMap basato

un albero rosso-nero. La mappa viene ordinata in base all'ordinamento naturale delle sue chiavi o tramite un comparatore fornito al momento della creazione della mappa, a seconda del costruttore utilizzato.

Cosa si intende per ordinamento naturale? Una classe utilizzata come chiave non deve implementare l'interfaccia Comparable, ma quale ordine verrà utilizzato al suo posto?

+6

Il punto della mia domanda è capire il termine "ordinamento naturale", non come ordinare le chiavi di una mappa in generale. –

risposta

5

Se si dovesse provare voi stessi che si può trovare che non è possibile utilizzare un TreeMap che ha un K che non implementa Comparable (A meno che non si fornisce esplicitamente un Comparator tramite il costruttore TreeMap).

public class App 
{ 
    public static void main(String[] args) 
    { 
     TreeMap<App,String> tm = new TreeMap<App,String>(); 
     tm.put(new App(), "value"); 
    } 
} 

Exception in thread "main" java.lang.ClassCastException: App non può essere lanciato a java.lang.Comparable

Javadoc per put() afferma esplicitamente:

Numero di lanci:
ClassCastException - se la chiave specificata non può essere confrontata con chiavi attualmente nella mappa

Il collegamento in javadocs for TreeMap per "ordine naturale" vi porta alla Comparable all'interfaccia

0

L'ordinamento naturale è determinato dai tasti.

Quindi se si utilizza una stringa si otterrà un ordine; Integer ne darà un altro.

Penso che Paragonabile sia un requisito.

+0

Grazie. Posso creare un oggetto TreeMap con una classe self-made che non implementa l'interfaccia Comparable. Almeno, non ho errori. L'API inoltre non applica restrizioni al tipo di chiave generica. –

+0

Quindi che ordinamento hai? Questo è il modo migliore per rispondere a tali domande: lascia che sia JVM a dirti. – duffymo

+0

Sì e no. Voglio sapere la risposta corretta, non una risposta generata dal test che potrebbe darmi una falsa impressione :-) –

4

L'ordinamento "naturale" è l'ordine implicito dall'implementazione dell'interfaccia dagli oggetti utilizzati come chiavi nello TreeMap. Essenzialmente, RBTree deve essere in grado di sapere quale tasto è più piccolo dell'altro chiave, e ci sono due modi per fornire la logica alla realizzazione RBTree:

  • Implementate Comparable interfaccia nella classe (i), utilizzati come chiavi TreeMap o
  • Fornire un'implementazione dello Comparator che farebbe il confronto al di fuori della classe chiave stessa.
1

ordinamento naturale è solo l'ordine fornito dall'interfaccia Comparable.È possibile creare un TreeMap senza un Comparator, ma qualsiasi tentativo di inserire chiavi che non implementano un ordine naturale genererà un valore ClassCastException.

2

E è un requisito per implementare Comparable. Non è applicato al momento della compilazione.

jamlong% cat Wah.java 

import java.util.*; 

public class Wah { 

    public static void main(String[] args) { 
     TreeMap<Wah, Integer> wah = new TreeMap<Wah, Integer>(); 
     wah.put(new Wah(), 1); 
     wah.put(new Wah(), 2); 
    } 
} 

jamlong% java Wah 

Exception in thread "main" java.lang.ClassCastException: Wah cannot be cast to java.lang.Comparable 
    at java.util.TreeMap.put(TreeMap.java:542) 
    at Wah.main(Wah.java:8) 

In caso di dubbio, read the TreeMap source. Linea 541, per esempio.

+0

* "È necessario implementare Paragonabile." * - NON è un requisito difficile. Se istanziate la 'TreeMap' con un' Comparator', le chiavi non devono implementare 'Comparable'. –

+0

@StephenC - Sicuramente avrei potuto essere più chiaro nella mia formulazione, ma la domanda era fondamentalmente nel contesto del "Natural Ordering", che si applica solo se non stai utilizzando una TreeMap istanziata con un Comparator nel primo luogo (o, suppongo, se istanziate esplicitamente con un comparatore che ha dato l'ordinamento naturale - ma ciò renderebbe la domanda piuttosto insensata), nel qual caso la mia risposta è valida - non impone che la classe sia comparabile, ma classificherà ClassCastException in fase di esecuzione se non lo è. – James