2012-12-30 10 views
6

Mögliche Duplizieren:
How can I sort the keys of a Map in Java?Was ist "natürliche Reihenfolge" in einer TreeMap?

In der Klasse TreeMap die Java API sagt:

Ein Rot-Schwarz-Baum basiert NavigableMap Umsetzung. Die Map wird nach der natürlichen Reihenfolge ihrer Schlüssel sortiert oder nach einem Comparator, der bei der Erstellung der Map zur Verfügung gestellt wird, abhängig davon, welcher Konstruktor verwendet wird.

Was ist mit natürlicher Bestellung gemeint? Eine Klasse, die als Schlüssel verwendet wird, muss nicht die Comparable Schnittstelle implementieren, aber welche Reihenfolge wird stattdessen verwendet?

+6

Der Punkt meiner Frage ist, den Begriff "natürliche Ordnung" zu verstehen, nicht, wie man die Schlüssel einer Karte im Allgemeinen sortiert. –

Antwort

5

Wenn Sie waren, dies zu versuchen, sich selbst würden Sie feststellen, dass Sie keine TreeMap verwenden können, die eine K hat, die nicht Comparable nicht implementiert (Es sei denn, Sie explizit einen Comparator über den TreeMap Konstruktor zur Verfügung stellen).

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 kann nicht auf java.lang.Comparable gegossen werden

Die javadoc für put() Staaten dies ausdrücklich:

Wirf:
ClassCastException - wenn der angegebene Schlüssel nicht mit dem verglichen werden kann zur Zeit Schlüssel in der Karte

Der Link in javadocs for TreeMap für „natürliche Ordnung“ gelangen Sie zum

0

Die natürliche Reihenfolge wird durch die Tasten bestimmt.

Wenn Sie also eine Zeichenfolge verwenden, erhalten Sie eine Bestellung; Integer wird ein anderes geben.

Ich denke, vergleichbar ist eine Anforderung.

+0

Danke. Ich kann ein TreeMap-Objekt mit einer selbst erstellten Klasse erstellen, die die Vergleichsschnittstelle nicht implementiert. Zumindest bekomme ich keine Fehler. Die API gibt auch keine Einschränkungen für den generischen Schlüsseltyp vor. –

+0

Also, welche Bestellung bekommst du? Dies ist der beste Weg, um solche Fragen zu beantworten: Lassen Sie die JVM es Ihnen sagen. – duffymo

+0

Ja und nein. Ich möchte die richtige Antwort wissen, nicht eine Test-generierte Antwort, die mir möglicherweise einen falschen Eindruck geben könnte :-) –

4

"Natürliche" Reihenfolge ist die Reihenfolge impliziert durch die Implementierung der Comparable Schnittstelle durch die Objekte als Schlüssel in der TreeMap. Im Wesentlichen ist RBTree muss in der Lage sein zu sagen, welcher Taste kleiner als der andere Schlüssel, und es gibt zwei Möglichkeiten, um die Logik die RBTree Implementierung zu liefern:

  • Implementieren Comparable Schnittstelle in der Klasse (n), die als Schlüssel zu oder
  • Geben Sie eine Implementierung des Comparator, die außerhalb der Schlüsselklasse selbst vergleichen würde.
1

natürliche Ordnung Comparable Schnittstelle nimmt, ist nur die Reihenfolge der Comparable Schnittstelle zur Verfügung gestellt.Sie können ein TreeMap ohne ein Comparator erstellen, aber jeder Versuch, alle Schlüssel zu setzen, die keine natürliche Reihenfolge implementieren, wird ClassCastException werfen.

2

Es ist eine Anforderung zu implementieren Comparable. Es wird nur zur Kompilierzeit nicht erzwungen.

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) 

Im Zweifelsfall read the TreeMap source. Linie 541 zum Beispiel.

+0

* "Es ist eine Voraussetzung, vergleichbar zu implementieren." * - Es ist keine schwierige Anforderung. Wenn Sie die 'TreeMap' mit einem' Comparator' instanziieren, müssen die Schlüssel 'Comparable' nicht implementieren. –

+0

@StephenC - Ich hätte sicherlich klarer in meinen Formulierungen sein können, aber die Frage war im Grunde genommen im Zusammenhang mit der "Natürlichen Ordnung", die nur zutrifft, wenn Sie keine TreeMap verwenden, die in der ersten Instanz kompariert wurde place (oder, wenn Sie explizit mit einem Comparator instanziiert haben, der die Natural Ordering instanziiert - aber das würde die Frage eher unsinnig machen), in welchem ​​Fall meine Antwort steht - es erzwingt nicht, dass die Klasse Comparable ist, aber Es wird ClassCastException zur Laufzeit, wenn es nicht ist. – James

Verwandte Themen