2012-12-30 34 views
6

Powiel możliwe:
How can I sort the keys of a Map in Java?Co to jest "naturalna kolejność" w TreeMap?

W klasie TreeMap Java API mówi:

czerwono-czarne drzewo realizacja NavigableMap oparty. Mapa jest sortowana według naturalnej kolejności jej kluczy lub komparatora dostarczonego w czasie tworzenia mapy, w zależności od tego, który konstruktor jest używany.

Co należy rozumieć przez zamawianie naturalne? Klasa używana jako klucz nie musi implementować interfejsu Comparable, ale w jaki sposób będzie używane zamawianie?

+6

Punktem mojego pytania jest zrozumienie pojęcia "porządek naturalny", a nie ogólne sortowanie kluczy mapy. –

Odpowiedz

5

Jeśli było spróbować samemu by się okazać, że nie można użyć TreeMap że ma K że nie wykona Comparable (chyba że wyraźnie dostarczenie Comparator przez konstruktora TreeMap).

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

Wyjątek w wątku "main" java.lang.ClassCastException: Aplikacja nie może być oddane do java.lang.Comparable

Javadoc dla put() stanach to extenso:

Zgłasza:
ClassCastException - jeśli określonego klucza nie można porównać z Klucze obecnie na mapie

Link w javadocs for TreeMap dla „porządkowanie naturalne” zabierze Cię do interfejsu Comparable

0

Naturalne porządkowanie jest określane za pomocą klawiszy.

Więc jeśli użyjesz łańcucha, dostaniesz jedno zamówienie; Integer da inny.

Myślę, że Porównywalne to wymaganie.

+0

Dziękuję. Mogę utworzyć obiekt TreeMap z własną klasą, która nie implementuje porównywalnego interfejsu. Przynajmniej nie dostaję błędów. Interfejs API nie nakłada również żadnych ograniczeń na kluczowy typ ogólny. –

+0

Jakie są twoje zamówienia? To najlepszy sposób na udzielenie odpowiedzi na takie pytania: pozwól JVM powiedzieć. – duffymo

+0

Tak i nie. Chcę poznać poprawną odpowiedź, a nie wygenerowaną przez test odpowiedź, która mogłaby dać mi fałszywe wrażenie :-) –

4

"Naturalny" porządek to porządek implikowany przez implementację interfejsu Comparable przez obiekty używane jako klucze w TreeMap. Zasadniczo RBTree musi być w stanie powiedzieć, który klucz jest mniejszy niż drugi klucz, a istnieją dwa sposoby, aby dostarczyć tę logikę do realizacji RBTree:

  • Implement Comparable interfejsu w klasie (ów) stosowanego jako klucze do TreeMap lub
  • Dostarczenie implementacji Comparator, która dokonałaby porównania poza samą klasą klucza.
1

naturalne zamawiania jest tylko kolejność dostarczane przez interfejs Comparable.Możesz utworzyć TreeMap bez Comparator, ale wtedy każda próba wprowadzenia kluczy, które nie realizują zamówień naturalnych spowoduje wyświetlenie ClassCastException.

2

To jest wymóg wdrożenia Comparable. To nie jest wymuszane podczas kompilacji.

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) 

W razie wątpliwości: read the TreeMap source. Linia 541, na przykład.

+0

* "Wymagane jest wdrożenie Porównywalne." * - NIE jest to trudne wymaganie. Jeśli utworzysz 'TreeMap' z' Komparatorem', klucze nie muszą implementować 'Comparable'. –

+0

@StephenC - Z pewnością mogłem być bardziej zrozumiały w moim brzmieniu, ale pytanie było zasadniczo pytaniem w kontekście "Natural Ordering", które miałoby zastosowanie tylko wtedy, gdy nie używasz TreeMap utworzonej z Komparatora w pierwszym miejsce (lub, jak przypuszczam, jeśli jawnie utworzono z Komparatora, który dał Naturalne Zamówienie - ale to spowodowałoby, że pytanie byłoby raczej bezsensowne), w którym to przypadku, moja odpowiedź brzmi - nie wymusza, że ​​klasa jest Porównywalna, ale to będzie ClassCastException w środowisku wykonawczym, jeśli tak nie jest. – James