K implementaci se používá TreeMap v Javě Mapové rozhraní a NavigableMap spolu s třídou AbstractMap. Mapa je řazena podle přirozeného řazení svých klíčů nebo podle a Komparátor poskytované v době vytváření mapy v závislosti na použitém konstruktoru. To se ukazuje jako efektivní způsob třídění a ukládání párů klíč-hodnota. Pořadí ukládání udržované stromovou mapou musí být konzistentní s rovností stejně jako jakákoli jiná seřazená mapa, bez ohledu na explicitní komparátory. Implementace stromové mapy není synchronizována v tom smyslu, že pokud k mapě přistupuje více vláken, současně a alespoň jedno z vláken strukturálně upravuje mapu, musí být synchronizována externě.
TreeMap v Javě je konkrétní implementace rozhraní java.util.SortedMap. Poskytuje uspořádanou kolekci párů klíč-hodnota, kde jsou klíče seřazeny na základě jejich přirozeného pořadí nebo vlastního komparátoru předaného konstruktoru.
TreeMap je implementována pomocí Red-Black stromu, což je typ samovyvažujícího binárního vyhledávacího stromu. To poskytuje efektivní výkon pro běžné operace, jako je přidávání, odebírání a načítání prvků, s průměrnou časovou složitostí O(log n).
Zde je příklad, jak používat třídu TreeMap:
Jáva
import> java.util.Map;> import> java.util.TreeMap;> public> class> Main {> >public> static> void> main(String[] args) {> >Map treeMap =>new> TreeMap();> >// Adding elements to the tree map> >treeMap.put(>'A'>,>1>);> >treeMap.put(>'C'>,>3>);> >treeMap.put(>'B'>,>2>);> >// Getting values from the tree map> >int> valueA = treeMap.get(>'A'>);> >System.out.println(>'Value of A: '> + valueA);> >// Removing elements from the tree map> >treeMap.remove(>'B'>);> >// Iterating over the elements of the tree map> >for> (String key : treeMap.keySet()) {> >System.out.println(>'Key: '> + key +>', Value: '> + treeMap.get(key));> >}> >}> }> |
>
>Výstup
Value of A: 1 Key: A, Value: 1 Key: C, Value: 3>

Vlastnosti stromové mapy
Některé důležité vlastnosti stromové mapy jsou následující:
- Tato třída je členem Kolekce Java Rámec.
- Třída implementuje Mapová rozhraní včetně NavigableMap , SortedMap a rozšiřuje třídu AbstractMap.
- TreeMap v Javě neumožňuje nulové klíče (jako Map), a proto je vyvolána výjimka NullPointerException. K různým klíčům však může být přiřazeno více hodnot null.
- Vstupní páry vrácené metodami v této třídě a její pohledy představují snímky mapování v době, kdy byly vytvořeny. Nepodporují metodu Entry.setValue.
Nyní pojďme kupředu a pojďme diskutovat o synchronizované stromové mapě. Implementace stromové mapy není synchronizována. To znamená, že pokud k sadě stromu přistupuje více vláken současně a alespoň jedno z nich sadu upravuje, musí být synchronizována externě. Toho se obvykle dosáhne pomocí metody Collections.synchronizedSortedMap. To se nejlépe provádí v době vytvoření, aby se zabránilo náhodnému nesynchronizovanému přístupu k sadě. To lze provést takto:
SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));>
Geekové, teď se musíte divit, jak funguje TreeMap interně?
Metody ve stromové mapě při získávání sady klíčů a hodnot vracejí Iterátor, který je svou povahou rychlý. Jakákoli souběžná úprava tedy vyvolá ConcurrentModificationException . Stromová mapa je založena na červeno-černé stromové struktuře dat.
Každý uzel ve stromu má:
- 3 proměnné ( Klíč K = klíč, hodnota V = hodnota, logická barva = barva )
- 3 reference ( Vstup vlevo = Levý, Vstup vpravo = Pravý, Vstup rodič = Rodič )
Konstruktoři v TreeMap
Abychom mohli vytvořit TreeMap, musíme vytvořit objekt třídy TreeMap. Třída TreeMap se skládá z různých konstruktorů, které umožňují možné vytvoření TreeMap. V této třídě jsou k dispozici následující konstruktory:
- TreeMap()
- TreeMap (Comparator comp)
- Stromová mapa (Mapa M)
- Stromová mapa (SortedMap sm)
Proberme je jednotlivě spolu s implementací každého konstruktoru takto:
Konstruktor 1: TreeMap()
Tento konstruktor se používá k vytvoření prázdné stromové mapy, která bude setříděna pomocí přirozeného pořadí svých klíčů.
Příklad
Jáva
// Java Program to Demonstrate TreeMap> // using the Default Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> // TreeMapImplementation> public> class> GFG {> >// Method 1> >// To show TreeMap constructor> >static> void> Example1stConstructor()> >{> >// Creating an empty TreeMap> >TreeMap tree_map> >=>new> TreeMap();> >// Mapping string values to int keys> >// using put() method> >tree_map.put(>10>,>'Geeks'>);> >tree_map.put(>15>,>'4'>);> >tree_map.put(>20>,>'Geeks'>);> >tree_map.put(>25>,>'Welcomes'>);> >tree_map.put(>30>,>'You'>);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 2> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap() constructor:
'>);> >// Calling constructor> >Example1stConstructor();> >}> }> |
>
>Výstup
TreeMap using TreeMap() constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}> Konstruktor 2: TreeMap (Comparator comp)
Tento konstruktor se používá k vytvoření prázdného objektu TreeMap, ve kterém budou prvky potřebovat externí specifikaci pořadí řazení.
Příklad
Jáva
// Java Program to Demonstrate TreeMap> // using Comparator Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Class 1> // Helper class representing Student> class> Student {> >// Attributes of a student> >int> rollno;> >String name, address;> >// Constructor> >public> Student(>int> rollno, String name, String address)> >{> >// This keyword refers to current object itself> >this>.rollno = rollno;> >this>.name = name;> >this>.address = address;> >}> >// Method of this class> >// To print student details> >public> String toString()> >{> >return> this>.rollno +> +>this>.name +> >+>this>.address;> >}> }> // Class 2> // Helper class - Comparator implementation> class> Sortbyroll>implements> Comparator {> >// Used for sorting in ascending order of> >// roll number> >public> int> compare(Student a, Student b)> >{> >return> a.rollno - b.rollno;> >}> }> // Class 3> // Main class> public> class> GFG {> >// Calling constructor inside main()> >static> void> Example2ndConstructor()> >{> >// Creating an empty TreeMap> >TreeMap tree_map> >=>new> TreeMap(> >new> Sortbyroll());> >// Mapping string values to int keys> >tree_map.put(>new> Student(>111>,>'bbbb'>,>'london'>),>2>);> >tree_map.put(>new> Student(>131>,>'aaaa'>,>'nyc'>),>3>);> >tree_map.put(>new> Student(>121>,>'cccc'>,>'jaipur'>),>1>);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap(Comparator)'> >+>' constructor:
'>);> >Example2ndConstructor();> >}> }> |
>
>Výstup
TreeMap using TreeMap(Comparator) constructor: TreeMap: {111 bbbb london=2, 121 cccc jaipur=1, 131 aaaa nyc=3}> Konstruktor 3: Stromová mapa (Mapa M)
Tento konstruktor se používá k inicializaci TreeMap se záznamy z dané mapy M, které budou seřazeny podle přirozeného pořadí kláves.
Příklad
Jáva
// Java Program to Demonstrate TreeMap> // using the Default Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> public> class> TreeMapImplementation {> >// Method 1> >// To illustrate constructor> >static> void> Example3rdConstructor()> >{> >// Creating an empty HashMap> >Map hash_map> >=>new> HashMap();> >// Mapping string values to int keys> >// using put() method> >hash_map.put(>10>,>'Geeks'>);> >hash_map.put(>15>,>'4'>);> >hash_map.put(>20>,>'Geeks'>);> >hash_map.put(>25>,>'Welcomes'>);> >hash_map.put(>30>,>'You'>);> >// Creating the TreeMap using the Map> >TreeMap tree_map> >=>new> TreeMap(hash_map);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 2> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap(Map)'> >+>' constructor:
'>);> >Example3rdConstructor();> >}> }> |
>
>Výstup
TreeMap using TreeMap(Map) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}> Konstruktor 4: Stromová mapa (SortedMap sm)
Tento konstruktor se používá k inicializaci TreeMap se záznamy z dané seřazené mapy, které budou uloženy ve stejném pořadí jako daná seřazená mapa.
Příklad
Jáva
// Java Program to Demonstrate TreeMap> // using the SortedMap Constructor> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> // TreeMapImplementation> public> class> GFG {> >// Method> >// To show TreeMap(SortedMap) constructor> >static> void> Example4thConstructor()> >{> >// Creating a SortedMap> >SortedMap sorted_map> >=>new> ConcurrentSkipListMap();> >// Mapping string values to int keys> >// using put() method> >sorted_map.put(>10>,>'Geeks'>);> >sorted_map.put(>15>,>'4'>);> >sorted_map.put(>20>,>'Geeks'>);> >sorted_map.put(>25>,>'Welcomes'>);> >sorted_map.put(>30>,>'You'>);> >// Creating the TreeMap using the SortedMap> >TreeMap tree_map> >=>new> TreeMap(sorted_map);> >// Printing the elements of TreeMap> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 2> >// Main driver method> >public> static> void> main(String[] args)> >{> >System.out.println(>'TreeMap using '> >+>'TreeMap(SortedMap)'> >+>' constructor:
'>);> >Example4thConstructor();> >}> }> |
>
>Výstup
TreeMap using TreeMap(SortedMap) constructor: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You}> Metody ve třídě TreeMap
| Metoda | Akce provedena |
|---|---|
| Průhledná() | Metoda odstraní všechna mapování z této stromové mapy a vymaže mapu. |
| klon() | Metoda vrací mělkou kopii této stromové mapy. |
| obsahuje klíč (objektový klíč) | Vrátí hodnotu true, pokud tato mapa obsahuje mapování pro zadaný klíč. |
| obsahujeValue(hodnota objektu) | Vrátí hodnotu true, pokud tato mapa mapuje jeden nebo více klíčů na zadanou hodnotu. |
| entrySet() | Vrátí nastavený pohled na mapování obsažená v této mapě. |
| firstKey() | Vrátí první (nejnižší) klíč aktuálně v této tříděné mapě. |
| get (klíč objektu) | Vrátí hodnotu, na kterou tato mapa mapuje zadaný klíč. |
| headMap (hodnota klíče objektu) | Metoda vrací pohled na část mapy striktně menší než parametr key_value. |
| keySet() | Metoda vrací zobrazení Set klíčů obsažených ve stromové mapě. |
| lastKey() | Vrátí poslední (nejvyšší) klíč aktuálně v této tříděné mapě. |
| put (klíč objektu, hodnota objektu) | Metoda se používá k vložení mapování do mapy. |
| putAll (mapa mapy) | Zkopíruje všechna mapování ze zadané mapy do této mapy. |
| odstranit (klíč objektu) | Odstraní mapování tohoto klíče z této stromové mapy, pokud je přítomno. |
| velikost() | Vrátí počet mapování párů klíč–hodnota v této mapě. |
| subMap((K startKey, K endKey) | Metoda vrací část této mapy, jejíž klíče jsou v rozsahu od startKey včetně, do endKey, exkluzivní. |
| hodnoty() | Vrátí zobrazení kolekce hodnot obsažených v této mapě. |
Implementace: Následující programy níže lépe ukáží, jak vytvořit, vložit a procházet stromovou mapu.
Ilustrace:
Jáva
// Java Program to Illustrate Operations in TreeMap> // Such as Creation, insertion> // searching, and traversal> // Importing required classes> import> java.util.*;> import> java.util.concurrent.*;> // Main class> // Implementation of TreeMap> public> class> GFG {> >// Declaring a TreeMap> >static> TreeMap tree_map;> >// Method 1> >// To create TreeMap> >static> void> create()> >{> >// Creating an empty TreeMap> >tree_map =>new> TreeMap();> >// Display message only> >System.out.println(>'TreeMap successfully'> >+>' created'>);> >}> >// Method 2> >// To Insert values in the TreeMap> >static> void> insert()> >{> >// Mapping string values to int keys> >// using put() method> >tree_map.put(>10>,>'Geeks'>);> >tree_map.put(>15>,>'4'>);> >tree_map.put(>20>,>'Geeks'>);> >tree_map.put(>25>,>'Welcomes'>);> >tree_map.put(>30>,>'You'>);> >// Display message only> >System.out.println(>'
Elements successfully'> >+>' inserted in the TreeMap'>);> >}> >// Method 3> >// To search a key in TreeMap> >static> void> search(>int> key)> >{> >// Checking for the key> >System.out.println(>'
Is key ''> + key> >+>'' present? '> >+ tree_map.containsKey(key));> >}> >// Method 4> >// To search a value in TreeMap> >static> void> search(String value)> >{> >// Checking for the value> >System.out.println(>'
Is value ''> + value> >+>'' present? '> >+ tree_map.containsValue(value));> >}> >// Method 5> >// To display the elements in TreeMap> >static> void> display()> >{> >// Displaying the TreeMap> >System.out.println(>'
Displaying the TreeMap:'>);> >System.out.println(>'TreeMap: '> + tree_map);> >}> >// Method 6> >// To traverse TreeMap> >static> void> traverse()> >{> >// Display message only> >System.out.println(>'
Traversing the TreeMap:'>);> >for> (Map.Entry e :> >tree_map.entrySet())> >System.out.println(e.getKey() +> >+ e.getValue());> >}> >// Method 6> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Calling above defined methods inside main()> >// Creating a TreeMap> >create();> >// Inserting the values in the TreeMap> >insert();> >// Search key '50' in the TreeMap> >search(>50>);> >// Search value 'Geeks' in the TreeMap> >search(>'Geeks'>);> >// Display the elements in TreeMap> >display();> >// Traversing the TreeMap> >traverse();> >}> }> |
>
>Výstup
TreeMap successfully created Elements successfully inserted in the TreeMap Is key '50' present? false Is value 'Geeks' present? true Displaying the TreeMap: TreeMap: {10=Geeks, 15=4, 20=Geeks, 25=Welcomes, 30=You} Traversing the TreeMap: 10 Geeks 15 4 20 Geeks 25 Welcomes 30 You> Provádění různých operací na TreeMap
Po zavedení Generics v Javě 1.5 je možné omezit typ objektu, který lze uložit do TreeMap. Nyní se podívejme, jak provést několik často používaných operací na stromové mapě.
Operace 1: Přidávání prvků
Abychom přidali prvek do TreeMap, můžeme použít metodu put() . Pořadí vložení však není ve stromové mapě zachováno. Interně jsou klíče pro každý prvek porovnány a seřazeny ve vzestupném pořadí.
Příklad
Jáva
// Java Program to Illustrate Addition of Elements> // in TreeMap using put() Method> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Default Initialization of a TreeMap> >TreeMap tm1 =>new> TreeMap();> >// Inserting the elements in TreeMap> >// using put() method> >tm1.put(>3>,>'Geeks'>);> >tm1.put(>2>,>'For'>);> >tm1.put(>1>,>'Geeks'>);> >// Initialization of a TreeMap using Generics> >TreeMap tm2> >=>new> TreeMap();> >// Inserting the elements in TreeMap> >// again using put() method> >tm2.put(>new> Integer(>3>),>'Geeks'>);> >tm2.put(>new> Integer(>2>),>'For'>);> >tm2.put(>new> Integer(>1>),>'Geeks'>);> >// Printing the elements of both TreeMaps> >// Map 1> >System.out.println(tm1);> >// Map 2> >System.out.println(tm2);> >}> }> |
>
>Výstup
{1=Geeks, 2=For, 3=Geeks} {1=Geeks, 2=For, 3=Geeks}> Operace 2: Výměna prvků
Po přidání prvků, pokud chceme prvek změnit, to lze provést opětovným přidáním prvku pomocí metody put() . Vzhledem k tomu, že prvky ve stromové mapě jsou indexovány pomocí klíčů, hodnotu klíče lze změnit jednoduchým vložením aktualizované hodnoty klíče, který chceme změnit.
Příklad
Jáva
// Java program to Illustrate Updation of Elements> // in TreeMap using put() Method> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Initialization of a TreeMap> >// using Generics> >TreeMap tm> >=>new> TreeMap();> >// Inserting the elements in Map> >// using put() method> >tm.put(>3>,>'Geeks'>);> >tm.put(>2>,>'Geeks'>);> >tm.put(>1>,>'Geeks'>);> >// Print all current elements in map> >System.out.println(tm);> >// Inserting the element at specified> >// corresponding to specified key> >tm.put(>2>,>'For'>);> >// Printing the updated elements of Map> >System.out.println(tm);> >}> }> |
>
>Výstup
{1=Geeks, 2=Geeks, 3=Geeks} {1=Geeks, 2=For, 3=Geeks}> Operace 3: Odebírání prvku
Abychom odstranili prvek ze stromové mapy, můžeme použít metodu remove() . Tato metoda převezme hodnotu klíče a odstraní mapování pro klíč z této stromové mapy, pokud je v mapě přítomen.
Příklad
Jáva
css pozadí
// Java program to Illustrate Removal of Elements> // in TreeMap using remove() Method> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Initialization of a TreeMap> >// using Generics> >TreeMap tm> >=>new> TreeMap();> >// Inserting the elements> >// using put() method> >tm.put(>3>,>'Geeks'>);> >tm.put(>2>,>'Geeks'>);> >tm.put(>1>,>'Geeks'>);> >tm.put(>4>,>'For'>);> >// Printing all elements of Map> >System.out.println(tm);> >// Removing the element corresponding to key> >tm.remove(>4>);> >// Printing updated TreeMap> >System.out.println(tm);> >}> }> |
>
>Výstup
{1=Geeks, 2=Geeks, 3=Geeks, 4=For} {1=Geeks, 2=Geeks, 3=Geeks}> Operace 4: Iterace přes TreeMap
Mapu lze iterovat několika způsoby. Nejznámějším způsobem je použití a pro každou smyčku a získat klíče. Hodnota klíče se zjistí pomocí metoda getValue(). .
Příklad
Jáva
// Java Program to Illustrate Iterating over TreeMap> // using> // Importing required classes> import> java.util.*;> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Initialization of a TreeMap> >// using Generics> >TreeMap tm> >=>new> TreeMap();> >// Inserting the elements> >// using put() method> >tm.put(>3>,>'Geeks'>);> >tm.put(>2>,>'For'>);> >tm.put(>1>,>'Geeks'>);> >// For-each loop for traversal over Map> >// via entrySet() Method> >for> (Map.Entry mapElement : tm.entrySet()) {> >int> key = (>int>)mapElement.getKey();> >// Finding the value> >String value = (String)mapElement.getValue();> >// Printing the key and value> >System.out.println(key +>' : '> + value);> >}> >}> }> |
>
>Výstup
1 : Geeks 2 : For 3 : Geeks>
Výhody TreeMap:
- Seřazené pořadí: Stromová mapa poskytuje seřazené pořadí svých prvků na základě přirozeného pořadí svých klíčů nebo vlastního komparátoru předaného konstruktoru. To je užitečné v situacích, kdy potřebujete načíst prvky v určitém pořadí.
- Předvídatelné pořadí iterací: Protože jsou prvky ve stromové mapě uloženy v seřazeném pořadí, můžete předvídat pořadí, ve kterém budou vráceny během iterace, což usnadňuje psaní algoritmů, které zpracovávají prvky v určitém pořadí.
- Výkon vyhledávání: TreeMap poskytuje efektivní implementaci rozhraní mapy, která vám umožňuje získávat prvky v logaritmickém čase, což je užitečné ve vyhledávacích algoritmech, kde potřebujete prvky rychle načíst.
- Self-balancing: TreeMap je implementován pomocí Red-Black stromu, což je typ samovyvažujícího binárního vyhledávacího stromu. To poskytuje efektivní výkon pro přidávání, odebírání a načítání prvků a také udržování setříděného pořadí prvků.
Nevýhody TreeMap:
- Pomalé vkládání prvků: Vkládání prvků do stromové mapy může být pomalejší než vkládání prvků do běžné mapy, protože stromová mapa musí udržovat seřazené pořadí svých prvků.
- Omezení klíče: Klíče ve stromové mapě musí implementovat rozhraní java.lang.Comparable nebo musí být poskytnut vlastní komparátor. To může být omezení, pokud potřebujete použít vlastní klíče, které neimplementují toto rozhraní.
Referenční knihy:
Java Collections od Maurice Naftalina a Philipa Wadlera. Tato kniha poskytuje komplexní přehled o frameworku Java Collections, včetně TreeMap.
Java v kostce od Davida Flanagana. Tato kniha poskytuje rychlý odkaz na základní funkce Javy, včetně stromové mapy.
Java Generics and Collections od Maurice Naftalina a Philipa Wadlera. Tato kniha poskytuje komplexního průvodce generikami a kolekcemi v Javě, včetně stromové mapy.